+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "G" ), p2.getNode( "I" ) ) != 22 ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testGetLCA() {
+ try {
+ final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+ final Phylogeny p1 = factory.create( "((((((A,B)ab,C)abc,D)abcd,E)abcde,F)abcdef,(G,H)gh)abcdefgh",
+ new NHXParser() )[ 0 ];
+ final PhylogenyNode A = PhylogenyMethods.calculateLCA( p1.getNode( "A" ), p1.getNode( "A" ) );
+ if ( !A.getName().equals( "A" ) ) {
+ return false;
+ }
+ final PhylogenyNode gh = PhylogenyMethods.calculateLCA( p1.getNode( "gh" ), p1.getNode( "gh" ) );
+ if ( !gh.getName().equals( "gh" ) ) {
+ return false;
+ }
+ final PhylogenyNode ab = PhylogenyMethods.calculateLCA( p1.getNode( "A" ), p1.getNode( "B" ) );
+ if ( !ab.getName().equals( "ab" ) ) {
+ return false;
+ }
+ final PhylogenyNode ab2 = PhylogenyMethods.calculateLCA( p1.getNode( "B" ), p1.getNode( "A" ) );
+ if ( !ab2.getName().equals( "ab" ) ) {
+ return false;
+ }
+ final PhylogenyNode gh2 = PhylogenyMethods.calculateLCA( p1.getNode( "H" ), p1.getNode( "G" ) );
+ if ( !gh2.getName().equals( "gh" ) ) {
+ return false;
+ }
+ final PhylogenyNode gh3 = PhylogenyMethods.calculateLCA( p1.getNode( "G" ), p1.getNode( "H" ) );
+ if ( !gh3.getName().equals( "gh" ) ) {
+ return false;
+ }
+ final PhylogenyNode abc = PhylogenyMethods.calculateLCA( p1.getNode( "C" ), p1.getNode( "A" ) );
+ if ( !abc.getName().equals( "abc" ) ) {
+ return false;
+ }
+ final PhylogenyNode abc2 = PhylogenyMethods.calculateLCA( p1.getNode( "A" ), p1.getNode( "C" ) );
+ if ( !abc2.getName().equals( "abc" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcd = PhylogenyMethods.calculateLCA( p1.getNode( "A" ), p1.getNode( "D" ) );
+ if ( !abcd.getName().equals( "abcd" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcd2 = PhylogenyMethods.calculateLCA( p1.getNode( "D" ), p1.getNode( "A" ) );
+ if ( !abcd2.getName().equals( "abcd" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcdef = PhylogenyMethods.calculateLCA( p1.getNode( "A" ), p1.getNode( "F" ) );
+ if ( !abcdef.getName().equals( "abcdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcdef2 = PhylogenyMethods.calculateLCA( p1.getNode( "F" ), p1.getNode( "A" ) );
+ if ( !abcdef2.getName().equals( "abcdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcdef3 = PhylogenyMethods.calculateLCA( p1.getNode( "ab" ), p1.getNode( "F" ) );
+ if ( !abcdef3.getName().equals( "abcdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcdef4 = PhylogenyMethods.calculateLCA( p1.getNode( "F" ), p1.getNode( "ab" ) );
+ if ( !abcdef4.getName().equals( "abcdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcde = PhylogenyMethods.calculateLCA( p1.getNode( "A" ), p1.getNode( "E" ) );
+ if ( !abcde.getName().equals( "abcde" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcde2 = PhylogenyMethods.calculateLCA( p1.getNode( "E" ), p1.getNode( "A" ) );
+ if ( !abcde2.getName().equals( "abcde" ) ) {
+ return false;
+ }
+ final PhylogenyNode r = PhylogenyMethods.calculateLCA( p1.getNode( "abcdefgh" ), p1.getNode( "abcdefgh" ) );
+ if ( !r.getName().equals( "abcdefgh" ) ) {
+ return false;
+ }
+ final PhylogenyNode r2 = PhylogenyMethods.calculateLCA( p1.getNode( "A" ), p1.getNode( "H" ) );
+ if ( !r2.getName().equals( "abcdefgh" ) ) {
+ return false;
+ }
+ final PhylogenyNode r3 = PhylogenyMethods.calculateLCA( p1.getNode( "H" ), p1.getNode( "A" ) );
+ if ( !r3.getName().equals( "abcdefgh" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcde3 = PhylogenyMethods.calculateLCA( p1.getNode( "E" ), p1.getNode( "abcde" ) );
+ if ( !abcde3.getName().equals( "abcde" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcde4 = PhylogenyMethods.calculateLCA( p1.getNode( "abcde" ), p1.getNode( "E" ) );
+ if ( !abcde4.getName().equals( "abcde" ) ) {
+ return false;
+ }
+ final PhylogenyNode ab3 = PhylogenyMethods.calculateLCA( p1.getNode( "ab" ), p1.getNode( "B" ) );
+ if ( !ab3.getName().equals( "ab" ) ) {
+ return false;
+ }
+ final PhylogenyNode ab4 = PhylogenyMethods.calculateLCA( p1.getNode( "B" ), p1.getNode( "ab" ) );
+ if ( !ab4.getName().equals( "ab" ) ) {
+ return false;
+ }
+ final Phylogeny p2 = factory.create( "(a,b,(((c,d)cd,e)cde,f)cdef)r", new NHXParser() )[ 0 ];
+ final PhylogenyNode cd = PhylogenyMethods.calculateLCA( p2.getNode( "c" ), p2.getNode( "d" ) );
+ if ( !cd.getName().equals( "cd" ) ) {
+ return false;
+ }
+ final PhylogenyNode cd2 = PhylogenyMethods.calculateLCA( p2.getNode( "d" ), p2.getNode( "c" ) );
+ if ( !cd2.getName().equals( "cd" ) ) {
+ return false;
+ }
+ final PhylogenyNode cde = PhylogenyMethods.calculateLCA( p2.getNode( "c" ), p2.getNode( "e" ) );
+ if ( !cde.getName().equals( "cde" ) ) {
+ return false;
+ }
+ final PhylogenyNode cde2 = PhylogenyMethods.calculateLCA( p2.getNode( "e" ), p2.getNode( "c" ) );
+ if ( !cde2.getName().equals( "cde" ) ) {
+ return false;
+ }
+ final PhylogenyNode cdef = PhylogenyMethods.calculateLCA( p2.getNode( "c" ), p2.getNode( "f" ) );
+ if ( !cdef.getName().equals( "cdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode cdef2 = PhylogenyMethods.calculateLCA( p2.getNode( "d" ), p2.getNode( "f" ) );
+ if ( !cdef2.getName().equals( "cdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode cdef3 = PhylogenyMethods.calculateLCA( p2.getNode( "f" ), p2.getNode( "d" ) );
+ if ( !cdef3.getName().equals( "cdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode rt = PhylogenyMethods.calculateLCA( p2.getNode( "c" ), p2.getNode( "a" ) );
+ if ( !rt.getName().equals( "r" ) ) {
+ return false;
+ }
+ final Phylogeny p3 = factory
+ .create( "((((a,(b,c)bc)abc,(d,e)de)abcde,f)abcdef,(((g,h)gh,(i,j)ij)ghij,k)ghijk,l)",
+ new NHXParser() )[ 0 ];
+ final PhylogenyNode bc_3 = PhylogenyMethods.calculateLCA( p3.getNode( "b" ), p3.getNode( "c" ) );
+ if ( !bc_3.getName().equals( "bc" ) ) {
+ return false;
+ }
+ final PhylogenyNode ac_3 = PhylogenyMethods.calculateLCA( p3.getNode( "a" ), p3.getNode( "c" ) );
+ if ( !ac_3.getName().equals( "abc" ) ) {
+ return false;
+ }
+ final PhylogenyNode ad_3 = PhylogenyMethods.calculateLCA( p3.getNode( "a" ), p3.getNode( "d" ) );
+ if ( !ad_3.getName().equals( "abcde" ) ) {
+ return false;
+ }
+ final PhylogenyNode af_3 = PhylogenyMethods.calculateLCA( p3.getNode( "a" ), p3.getNode( "f" ) );
+ if ( !af_3.getName().equals( "abcdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode ag_3 = PhylogenyMethods.calculateLCA( p3.getNode( "a" ), p3.getNode( "g" ) );
+ if ( !ag_3.getName().equals( "" ) ) {
+ return false;
+ }
+ if ( !ag_3.isRoot() ) {
+ return false;
+ }
+ final PhylogenyNode al_3 = PhylogenyMethods.calculateLCA( p3.getNode( "a" ), p3.getNode( "l" ) );
+ if ( !al_3.getName().equals( "" ) ) {
+ return false;
+ }
+ if ( !al_3.isRoot() ) {
+ return false;
+ }
+ final PhylogenyNode kl_3 = PhylogenyMethods.calculateLCA( p3.getNode( "k" ), p3.getNode( "l" ) );
+ if ( !kl_3.getName().equals( "" ) ) {
+ return false;
+ }
+ if ( !kl_3.isRoot() ) {
+ return false;
+ }
+ final PhylogenyNode fl_3 = PhylogenyMethods.calculateLCA( p3.getNode( "f" ), p3.getNode( "l" ) );
+ if ( !fl_3.getName().equals( "" ) ) {
+ return false;
+ }
+ if ( !fl_3.isRoot() ) {
+ return false;
+ }
+ final PhylogenyNode gk_3 = PhylogenyMethods.calculateLCA( p3.getNode( "g" ), p3.getNode( "k" ) );
+ if ( !gk_3.getName().equals( "ghijk" ) ) {
+ return false;
+ }
+ final Phylogeny p4 = factory.create( "(a,b,c)r", new NHXParser() )[ 0 ];
+ final PhylogenyNode r_4 = PhylogenyMethods.calculateLCA( p4.getNode( "b" ), p4.getNode( "c" ) );
+ if ( !r_4.getName().equals( "r" ) ) {
+ return false;
+ }
+ final Phylogeny p5 = factory.create( "((a,b),c,d)root", new NHXParser() )[ 0 ];
+ final PhylogenyNode r_5 = PhylogenyMethods.calculateLCA( p5.getNode( "a" ), p5.getNode( "c" ) );
+ if ( !r_5.getName().equals( "root" ) ) {
+ return false;
+ }
+ final Phylogeny p6 = factory.create( "((a,b),c,d)rot", new NHXParser() )[ 0 ];
+ final PhylogenyNode r_6 = PhylogenyMethods.calculateLCA( p6.getNode( "c" ), p6.getNode( "a" ) );
+ if ( !r_6.getName().equals( "rot" ) ) {
+ return false;
+ }
+ final Phylogeny p7 = factory.create( "(((a,b)x,c)x,d,e)rott", new NHXParser() )[ 0 ];
+ final PhylogenyNode r_7 = PhylogenyMethods.calculateLCA( p7.getNode( "a" ), p7.getNode( "e" ) );
+ if ( !r_7.getName().equals( "rott" ) ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testGetLCA2() {
+ try {
+ final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+ final Phylogeny p_a = factory.create( "(a)", new NHXParser() )[ 0 ];
+ PhylogenyMethods.preOrderReId( p_a );
+ final PhylogenyNode p_a_1 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p_a.getNode( "a" ),
+ p_a.getNode( "a" ) );
+ if ( !p_a_1.getName().equals( "a" ) ) {
+ return false;
+ }
+ final Phylogeny p_b = factory.create( "((a)b)", new NHXParser() )[ 0 ];
+ PhylogenyMethods.preOrderReId( p_b );
+ final PhylogenyNode p_b_1 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p_b.getNode( "b" ),
+ p_b.getNode( "a" ) );
+ if ( !p_b_1.getName().equals( "b" ) ) {
+ return false;
+ }
+ final PhylogenyNode p_b_2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p_b.getNode( "a" ),
+ p_b.getNode( "b" ) );
+ if ( !p_b_2.getName().equals( "b" ) ) {
+ return false;
+ }
+ final Phylogeny p_c = factory.create( "(((a)b)c)", new NHXParser() )[ 0 ];
+ PhylogenyMethods.preOrderReId( p_c );
+ final PhylogenyNode p_c_1 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p_c.getNode( "b" ),
+ p_c.getNode( "a" ) );
+ if ( !p_c_1.getName().equals( "b" ) ) {
+ return false;
+ }
+ final PhylogenyNode p_c_2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p_c.getNode( "a" ),
+ p_c.getNode( "c" ) );
+ if ( !p_c_2.getName().equals( "c" ) ) {
+ System.out.println( p_c_2.getName() );
+ System.exit( -1 );
+ return false;
+ }
+ final PhylogenyNode p_c_3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p_c.getNode( "a" ),
+ p_c.getNode( "b" ) );
+ if ( !p_c_3.getName().equals( "b" ) ) {
+ return false;
+ }
+ final PhylogenyNode p_c_4 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p_c.getNode( "c" ),
+ p_c.getNode( "a" ) );
+ if ( !p_c_4.getName().equals( "c" ) ) {
+ return false;
+ }
+ final Phylogeny p1 = factory.create( "((((((A,B)ab,C)abc,D)abcd,E)abcde,F)abcdef,(G,H)gh)abcdefgh",
+ new NHXParser() )[ 0 ];
+ PhylogenyMethods.preOrderReId( p1 );
+ final PhylogenyNode A = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "A" ),
+ p1.getNode( "A" ) );
+ if ( !A.getName().equals( "A" ) ) {
+ return false;
+ }
+ final PhylogenyNode gh = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "gh" ),
+ p1.getNode( "gh" ) );
+ if ( !gh.getName().equals( "gh" ) ) {
+ return false;
+ }
+ final PhylogenyNode ab = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "A" ),
+ p1.getNode( "B" ) );
+ if ( !ab.getName().equals( "ab" ) ) {
+ return false;
+ }
+ final PhylogenyNode ab2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "B" ),
+ p1.getNode( "A" ) );
+ if ( !ab2.getName().equals( "ab" ) ) {
+ return false;
+ }
+ final PhylogenyNode gh2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "H" ),
+ p1.getNode( "G" ) );
+ if ( !gh2.getName().equals( "gh" ) ) {
+ return false;
+ }
+ final PhylogenyNode gh3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "G" ),
+ p1.getNode( "H" ) );
+ if ( !gh3.getName().equals( "gh" ) ) {
+ return false;
+ }
+ final PhylogenyNode abc = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "C" ),
+ p1.getNode( "A" ) );
+ if ( !abc.getName().equals( "abc" ) ) {
+ return false;
+ }
+ final PhylogenyNode abc2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "A" ),
+ p1.getNode( "C" ) );
+ if ( !abc2.getName().equals( "abc" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcd = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "A" ),
+ p1.getNode( "D" ) );
+ if ( !abcd.getName().equals( "abcd" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcd2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "D" ),
+ p1.getNode( "A" ) );
+ if ( !abcd2.getName().equals( "abcd" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcdef = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "A" ),
+ p1.getNode( "F" ) );
+ if ( !abcdef.getName().equals( "abcdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcdef2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "F" ),
+ p1.getNode( "A" ) );
+ if ( !abcdef2.getName().equals( "abcdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcdef3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "ab" ),
+ p1.getNode( "F" ) );
+ if ( !abcdef3.getName().equals( "abcdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcdef4 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "F" ),
+ p1.getNode( "ab" ) );
+ if ( !abcdef4.getName().equals( "abcdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcde = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "A" ),
+ p1.getNode( "E" ) );
+ if ( !abcde.getName().equals( "abcde" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcde2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "E" ),
+ p1.getNode( "A" ) );
+ if ( !abcde2.getName().equals( "abcde" ) ) {
+ return false;
+ }
+ final PhylogenyNode r = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "abcdefgh" ),
+ p1.getNode( "abcdefgh" ) );
+ if ( !r.getName().equals( "abcdefgh" ) ) {
+ return false;
+ }
+ final PhylogenyNode r2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "A" ),
+ p1.getNode( "H" ) );
+ if ( !r2.getName().equals( "abcdefgh" ) ) {
+ return false;
+ }
+ final PhylogenyNode r3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "H" ),
+ p1.getNode( "A" ) );
+ if ( !r3.getName().equals( "abcdefgh" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcde3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "E" ),
+ p1.getNode( "abcde" ) );
+ if ( !abcde3.getName().equals( "abcde" ) ) {
+ return false;
+ }
+ final PhylogenyNode abcde4 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "abcde" ),
+ p1.getNode( "E" ) );
+ if ( !abcde4.getName().equals( "abcde" ) ) {
+ return false;
+ }
+ final PhylogenyNode ab3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "ab" ),
+ p1.getNode( "B" ) );
+ if ( !ab3.getName().equals( "ab" ) ) {
+ return false;
+ }
+ final PhylogenyNode ab4 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p1.getNode( "B" ),
+ p1.getNode( "ab" ) );
+ if ( !ab4.getName().equals( "ab" ) ) {
+ return false;
+ }
+ final Phylogeny p2 = factory.create( "(a,b,(((c,d)cd,e)cde,f)cdef)r", new NHXParser() )[ 0 ];
+ PhylogenyMethods.preOrderReId( p2 );
+ final PhylogenyNode cd = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p2.getNode( "c" ),
+ p2.getNode( "d" ) );
+ if ( !cd.getName().equals( "cd" ) ) {
+ return false;
+ }
+ final PhylogenyNode cd2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p2.getNode( "d" ),
+ p2.getNode( "c" ) );
+ if ( !cd2.getName().equals( "cd" ) ) {
+ return false;
+ }
+ final PhylogenyNode cde = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p2.getNode( "c" ),
+ p2.getNode( "e" ) );
+ if ( !cde.getName().equals( "cde" ) ) {
+ return false;
+ }
+ final PhylogenyNode cde2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p2.getNode( "e" ),
+ p2.getNode( "c" ) );
+ if ( !cde2.getName().equals( "cde" ) ) {
+ return false;
+ }
+ final PhylogenyNode cdef = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p2.getNode( "c" ),
+ p2.getNode( "f" ) );
+ if ( !cdef.getName().equals( "cdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode cdef2 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p2.getNode( "d" ),
+ p2.getNode( "f" ) );
+ if ( !cdef2.getName().equals( "cdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode cdef3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p2.getNode( "f" ),
+ p2.getNode( "d" ) );
+ if ( !cdef3.getName().equals( "cdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode rt = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p2.getNode( "c" ),
+ p2.getNode( "a" ) );
+ if ( !rt.getName().equals( "r" ) ) {
+ return false;
+ }
+ final Phylogeny p3 = factory
+ .create( "((((a,(b,c)bc)abc,(d,e)de)abcde,f)abcdef,(((g,h)gh,(i,j)ij)ghij,k)ghijk,l)",
+ new NHXParser() )[ 0 ];
+ PhylogenyMethods.preOrderReId( p3 );
+ final PhylogenyNode bc_3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p3.getNode( "b" ),
+ p3.getNode( "c" ) );
+ if ( !bc_3.getName().equals( "bc" ) ) {
+ return false;
+ }
+ final PhylogenyNode ac_3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p3.getNode( "a" ),
+ p3.getNode( "c" ) );
+ if ( !ac_3.getName().equals( "abc" ) ) {
+ return false;
+ }
+ final PhylogenyNode ad_3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p3.getNode( "a" ),
+ p3.getNode( "d" ) );
+ if ( !ad_3.getName().equals( "abcde" ) ) {
+ return false;
+ }
+ final PhylogenyNode af_3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p3.getNode( "a" ),
+ p3.getNode( "f" ) );
+ if ( !af_3.getName().equals( "abcdef" ) ) {
+ return false;
+ }
+ final PhylogenyNode ag_3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p3.getNode( "a" ),
+ p3.getNode( "g" ) );
+ if ( !ag_3.getName().equals( "" ) ) {
+ return false;
+ }
+ if ( !ag_3.isRoot() ) {
+ return false;
+ }
+ final PhylogenyNode al_3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p3.getNode( "a" ),
+ p3.getNode( "l" ) );
+ if ( !al_3.getName().equals( "" ) ) {
+ return false;
+ }
+ if ( !al_3.isRoot() ) {
+ return false;
+ }
+ final PhylogenyNode kl_3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p3.getNode( "k" ),
+ p3.getNode( "l" ) );
+ if ( !kl_3.getName().equals( "" ) ) {
+ return false;
+ }
+ if ( !kl_3.isRoot() ) {
+ return false;
+ }
+ final PhylogenyNode fl_3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p3.getNode( "f" ),
+ p3.getNode( "l" ) );
+ if ( !fl_3.getName().equals( "" ) ) {
+ return false;
+ }
+ if ( !fl_3.isRoot() ) {
+ return false;
+ }
+ final PhylogenyNode gk_3 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p3.getNode( "g" ),
+ p3.getNode( "k" ) );
+ if ( !gk_3.getName().equals( "ghijk" ) ) {
+ return false;
+ }
+ final Phylogeny p4 = factory.create( "(a,b,c)r", new NHXParser() )[ 0 ];
+ PhylogenyMethods.preOrderReId( p4 );
+ final PhylogenyNode r_4 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p4.getNode( "b" ),
+ p4.getNode( "c" ) );
+ if ( !r_4.getName().equals( "r" ) ) {
+ return false;
+ }
+ final Phylogeny p5 = factory.create( "((a,b),c,d)root", new NHXParser() )[ 0 ];
+ PhylogenyMethods.preOrderReId( p5 );
+ final PhylogenyNode r_5 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p5.getNode( "a" ),
+ p5.getNode( "c" ) );
+ if ( !r_5.getName().equals( "root" ) ) {
+ return false;
+ }
+ final Phylogeny p6 = factory.create( "((a,b),c,d)rot", new NHXParser() )[ 0 ];
+ PhylogenyMethods.preOrderReId( p6 );
+ final PhylogenyNode r_6 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p6.getNode( "c" ),
+ p6.getNode( "a" ) );
+ if ( !r_6.getName().equals( "rot" ) ) {
+ return false;
+ }
+ final Phylogeny p7 = factory.create( "(((a,b)x,c)x,d,e)rott", new NHXParser() )[ 0 ];
+ PhylogenyMethods.preOrderReId( p7 );
+ final PhylogenyNode r_7 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p7.getNode( "a" ),
+ p7.getNode( "e" ) );
+ if ( !r_7.getName().equals( "rott" ) ) {
+ return false;
+ }
+ final PhylogenyNode r_71 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p7.getNode( "e" ),
+ p7.getNode( "a" ) );
+ if ( !r_71.getName().equals( "rott" ) ) {
+ return false;
+ }
+ final PhylogenyNode r_72 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p7.getNode( "e" ),
+ p7.getNode( "rott" ) );
+ if ( !r_72.getName().equals( "rott" ) ) {
+ return false;
+ }
+ final PhylogenyNode r_73 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p7.getNode( "rott" ),
+ p7.getNode( "a" ) );
+ if ( !r_73.getName().equals( "rott" ) ) {
+ return false;
+ }
+ final PhylogenyNode r_74 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p7.getNode( "rott" ),
+ p7.getNode( "rott" ) );
+ if ( !r_74.getName().equals( "rott" ) ) {
+ return false;
+ }
+ final PhylogenyNode r_75 = PhylogenyMethods.calculateLCAonTreeWithIdsInPreOrder( p7.getNode( "e" ),
+ p7.getNode( "e" ) );
+ if ( !r_75.getName().equals( "e" ) ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testHmmscanOutputParser() {
+ final String test_dir = Test.PATH_TO_TEST_DATA;
+ try {
+ final HmmscanPerDomainTableParser parser1 = new HmmscanPerDomainTableParser( new File( test_dir
+ + ForesterUtil.getFileSeparator() + "hmmscan30b3_output_1" ), "MONBR", INDIVIDUAL_SCORE_CUTOFF.NONE );
+ parser1.parse();
+ final HmmscanPerDomainTableParser parser2 = new HmmscanPerDomainTableParser( new File( test_dir
+ + ForesterUtil.getFileSeparator() + "hmmscan30b3_output_2" ), "MONBR", INDIVIDUAL_SCORE_CUTOFF.NONE );
+ final List<Protein> proteins = parser2.parse();
+ if ( parser2.getProteinsEncountered() != 4 ) {
+ return false;
+ }
+ if ( proteins.size() != 4 ) {
+ return false;
+ }
+ if ( parser2.getDomainsEncountered() != 69 ) {
+ return false;
+ }
+ if ( parser2.getDomainsIgnoredDueToDuf() != 0 ) {
+ return false;
+ }
+ if ( parser2.getDomainsIgnoredDueToEval() != 0 ) {
+ return false;
+ }
+ final Protein p1 = proteins.get( 0 );
+ if ( p1.getNumberOfProteinDomains() != 15 ) {
+ return false;
+ }
+ if ( p1.getLength() != 850 ) {
+ return false;
+ }
+ final Protein p2 = proteins.get( 1 );
+ if ( p2.getNumberOfProteinDomains() != 51 ) {
+ return false;
+ }
+ if ( p2.getLength() != 1291 ) {
+ return false;
+ }
+ final Protein p3 = proteins.get( 2 );
+ if ( p3.getNumberOfProteinDomains() != 2 ) {
+ return false;
+ }
+ final Protein p4 = proteins.get( 3 );
+ if ( p4.getNumberOfProteinDomains() != 1 ) {
+ return false;
+ }
+ if ( !p4.getProteinDomain( 0 ).getDomainId().toString().equals( "DNA_pol_B_new" ) ) {
+ return false;
+ }
+ if ( p4.getProteinDomain( 0 ).getFrom() != 51 ) {
+ return false;
+ }
+ if ( p4.getProteinDomain( 0 ).getTo() != 395 ) {
+ return false;
+ }
+ if ( !Test.isEqual( p4.getProteinDomain( 0 ).getPerDomainEvalue(), 1.2e-39 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( p4.getProteinDomain( 0 ).getPerDomainScore(), 135.7 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( p4.getProteinDomain( 0 ).getPerSequenceEvalue(), 8.3e-40 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( p4.getProteinDomain( 0 ).getPerSequenceScore(), 136.3 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( p4.getProteinDomain( 0 ).getNumber(), 1 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( p4.getProteinDomain( 0 ).getTotalCount(), 1 ) ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testLastExternalNodeMethods() {
+ try {
+ final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+ final char[] a0 = { '(', '(', 'A', ',', 'B', ')', ',', '(', 'C', ',', 'D', ')', ')', };
+ final Phylogeny t0 = factory.create( a0, new NHXParser() )[ 0 ];
+ final PhylogenyNode n1 = t0.getNode( "A" );
+ if ( n1.isLastExternalNode() ) {
+ return false;
+ }
+ final PhylogenyNode n2 = t0.getNode( "B" );
+ if ( n2.isLastExternalNode() ) {
+ return false;
+ }
+ final PhylogenyNode n3 = t0.getNode( "C" );
+ if ( n3.isLastExternalNode() ) {
+ return false;
+ }
+ final PhylogenyNode n4 = t0.getNode( "D" );
+ if ( !n4.isLastExternalNode() ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testLevelOrderIterator() {
+ try {
+ final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+ final Phylogeny t0 = factory.create( "((A,B)ab,(C,D)cd)r", new NHXParser() )[ 0 ];
+ PhylogenyNodeIterator it0;
+ for( it0 = t0.iteratorLevelOrder(); it0.hasNext(); ) {
+ it0.next();
+ }
+ for( it0.reset(); it0.hasNext(); ) {
+ it0.next();
+ }
+ final PhylogenyNodeIterator it = t0.iteratorLevelOrder();
+ if ( !it.next().getName().equals( "r" ) ) {
+ return false;
+ }
+ if ( !it.next().getName().equals( "ab" ) ) {
+ return false;
+ }
+ if ( !it.next().getName().equals( "cd" ) ) {
+ return false;
+ }
+ if ( !it.next().getName().equals( "A" ) ) {
+ return false;
+ }
+ if ( !it.next().getName().equals( "B" ) ) {
+ return false;
+ }
+ if ( !it.next().getName().equals( "C" ) ) {
+ return false;
+ }
+ if ( !it.next().getName().equals( "D" ) ) {
+ return false;
+ }
+ if ( it.hasNext() ) {
+ return false;
+ }
+ final Phylogeny t2 = factory.create( "(((1,2,(a,(X,Y,Z)b)3,4,5,6)A,B,C)abc,(D,E,(f1,(f21)f2,f3)F,G)defg)r",
+ new NHXParser() )[ 0 ];
+ PhylogenyNodeIterator it2;
+ for( it2 = t2.iteratorLevelOrder(); it2.hasNext(); ) {
+ it2.next();
+ }
+ for( it2.reset(); it2.hasNext(); ) {
+ it2.next();
+ }
+ final PhylogenyNodeIterator it3 = t2.iteratorLevelOrder();
+ if ( !it3.next().getName().equals( "r" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "abc" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "defg" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "A" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "B" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "C" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "D" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "E" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "F" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "G" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "1" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "2" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "3" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "4" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "5" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "6" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "f1" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "f2" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "f3" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "a" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "b" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "f21" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "X" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "Y" ) ) {
+ return false;
+ }
+ if ( !it3.next().getName().equals( "Z" ) ) {
+ return false;
+ }
+ if ( it3.hasNext() ) {
+ return false;
+ }
+ final Phylogeny t4 = factory.create( "((((D)C)B)A)r", new NHXParser() )[ 0 ];
+ PhylogenyNodeIterator it4;
+ for( it4 = t4.iteratorLevelOrder(); it4.hasNext(); ) {
+ it4.next();
+ }
+ for( it4.reset(); it4.hasNext(); ) {
+ it4.next();
+ }
+ final PhylogenyNodeIterator it5 = t4.iteratorLevelOrder();
+ if ( !it5.next().getName().equals( "r" ) ) {
+ return false;
+ }
+ if ( !it5.next().getName().equals( "A" ) ) {
+ return false;
+ }
+ if ( !it5.next().getName().equals( "B" ) ) {
+ return false;
+ }
+ if ( !it5.next().getName().equals( "C" ) ) {
+ return false;
+ }
+ if ( !it5.next().getName().equals( "D" ) ) {
+ return false;
+ }
+ final Phylogeny t5 = factory.create( "A", new NHXParser() )[ 0 ];
+ PhylogenyNodeIterator it6;
+ for( it6 = t5.iteratorLevelOrder(); it6.hasNext(); ) {
+ it6.next();
+ }
+ for( it6.reset(); it6.hasNext(); ) {
+ it6.next();
+ }
+ final PhylogenyNodeIterator it7 = t5.iteratorLevelOrder();
+ if ( !it7.next().getName().equals( "A" ) ) {
+ return false;
+ }
+ if ( it.hasNext() ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testMafft( final String path ) {
+ try {
+ final List<String> opts = new ArrayList<String>();
+ opts.add( "--maxiterate" );
+ opts.add( "1000" );
+ opts.add( "--localpair" );
+ opts.add( "--quiet" );
+ Msa msa = null;
+ final MsaInferrer mafft = Mafft.createInstance( path );
+ msa = mafft.infer( new File( PATH_TO_TEST_DATA + "ncbi_sn.fasta" ), opts );
+ if ( ( msa == null ) || ( msa.getLength() < 20 ) || ( msa.getNumberOfSequences() != 19 ) ) {
+ return false;
+ }
+ if ( !msa.getIdentifier( 0 ).toString().equals( "a" ) ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testMidpointrooting() {
+ try {
+ final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+ final Phylogeny t0 = factory.create( "(A:1,B:4,C:2,D:2,E:6,F:1,G:1,H:1)", new NHXParser() )[ 0 ];
+ PhylogenyMethods.midpointRoot( t0 );
+ if ( !isEqual( t0.getNode( "E" ).getDistanceToParent(), 5 ) ) {
+ return false;
+ }
+ if ( !isEqual( t0.getNode( "B" ).getDistanceToParent(), 4 ) ) {
+ return false;
+ }
+ if ( !isEqual( PhylogenyMethods.calculateLCA( t0.getNode( "F" ), t0.getNode( "G" ) ).getDistanceToParent(),
+ 1 ) ) {
+ return false;
+ }
+ final Phylogeny t1 = factory.create( "((A:1,B:2)AB:1[&&NHX:B=55],(C:3,D:4)CD:3[&&NHX:B=10])ABCD:0.5",
+ new NHXParser() )[ 0 ];
+ if ( !t1.isRooted() ) {
+ return false;
+ }
+ PhylogenyMethods.midpointRoot( t1 );
+ if ( !isEqual( t1.getNode( "A" ).getDistanceToParent(), 1 ) ) {
+ return false;
+ }
+ if ( !isEqual( t1.getNode( "B" ).getDistanceToParent(), 2 ) ) {
+ return false;
+ }
+ if ( !isEqual( t1.getNode( "C" ).getDistanceToParent(), 3 ) ) {
+ return false;
+ }
+ if ( !isEqual( t1.getNode( "D" ).getDistanceToParent(), 4 ) ) {
+ return false;
+ }
+ if ( !isEqual( t1.getNode( "CD" ).getDistanceToParent(), 1 ) ) {
+ return false;
+ }
+ if ( !isEqual( t1.getNode( "AB" ).getDistanceToParent(), 3 ) ) {
+ return false;
+ }
+ t1.reRoot( t1.getNode( "A" ) );
+ PhylogenyMethods.midpointRoot( t1 );
+ if ( !isEqual( t1.getNode( "A" ).getDistanceToParent(), 1 ) ) {
+ return false;
+ }
+ if ( !isEqual( t1.getNode( "B" ).getDistanceToParent(), 2 ) ) {
+ return false;
+ }
+ if ( !isEqual( t1.getNode( "C" ).getDistanceToParent(), 3 ) ) {
+ return false;
+ }
+ if ( !isEqual( t1.getNode( "D" ).getDistanceToParent(), 4 ) ) {
+ return false;
+ }
+ if ( !isEqual( t1.getNode( "CD" ).getDistanceToParent(), 1 ) ) {
+ System.exit( -1 );
+ return false;
+ }
+ if ( !isEqual( t1.getNode( "AB" ).getDistanceToParent(), 3 ) ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testMsaQualityMethod() {
+ try {
+ final Sequence s0 = BasicSequence.createAaSequence( "a", "ABAXEFGHIJ" );
+ final Sequence s1 = BasicSequence.createAaSequence( "b", "ABBXEFGHIJ" );
+ final Sequence s2 = BasicSequence.createAaSequence( "c", "AXCXEFGHIJ" );
+ final Sequence s3 = BasicSequence.createAaSequence( "d", "AXDDEFGHIJ" );
+ final List<Sequence> l = new ArrayList<Sequence>();
+ l.add( s0 );
+ l.add( s1 );
+ l.add( s2 );
+ l.add( s3 );
+ final Msa msa = BasicMsa.createInstance( l );
+ if ( !isEqual( 1, MsaMethods.calculateIdentityRatio( msa, 0 ) ) ) {
+ return false;
+ }
+ if ( !isEqual( 0.5, MsaMethods.calculateIdentityRatio( msa, 1 ) ) ) {
+ return false;
+ }
+ if ( !isEqual( 0.25, MsaMethods.calculateIdentityRatio( msa, 2 ) ) ) {
+ return false;
+ }
+ if ( !isEqual( 0.75, MsaMethods.calculateIdentityRatio( msa, 3 ) ) ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testNextNodeWithCollapsing() {
+ try {
+ final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+ PhylogenyNode n;
+ List<PhylogenyNode> ext = new ArrayList<PhylogenyNode>();
+ final StringBuffer sb0 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h))fgh)cdefgh)abcdefgh" );
+ final Phylogeny t0 = factory.create( sb0, new NHXParser() )[ 0 ];
+ t0.getNode( "cd" ).setCollapse( true );
+ t0.getNode( "cde" ).setCollapse( true );
+ n = t0.getFirstExternalNode();
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( !ext.get( 0 ).getName().equals( "a" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "b" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "cde" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "f" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "g" ) ) {
+ return false;
+ }
+ if ( !ext.get( 5 ).getName().equals( "h" ) ) {
+ return false;
+ }
+ ext.clear();
+ final StringBuffer sb1 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h))fgh)cdefgh)abcdefgh" );
+ final Phylogeny t1 = factory.create( sb1, new NHXParser() )[ 0 ];
+ t1.getNode( "ab" ).setCollapse( true );
+ t1.getNode( "cd" ).setCollapse( true );
+ t1.getNode( "cde" ).setCollapse( true );
+ n = t1.getNode( "ab" );
+ ext = new ArrayList<PhylogenyNode>();
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( !ext.get( 0 ).getName().equals( "ab" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "cde" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "f" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "g" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "h" ) ) {
+ return false;
+ }
+ //
+ //
+ ext.clear();
+ final StringBuffer sb2 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h)gh)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t2 = factory.create( sb2, new NHXParser() )[ 0 ];
+ t2.getNode( "ab" ).setCollapse( true );
+ t2.getNode( "cd" ).setCollapse( true );
+ t2.getNode( "cde" ).setCollapse( true );
+ t2.getNode( "c" ).setCollapse( true );
+ t2.getNode( "d" ).setCollapse( true );
+ t2.getNode( "e" ).setCollapse( true );
+ t2.getNode( "gh" ).setCollapse( true );
+ n = t2.getNode( "ab" );
+ ext = new ArrayList<PhylogenyNode>();
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( !ext.get( 0 ).getName().equals( "ab" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "cde" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "f" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "gh" ) ) {
+ return false;
+ }
+ //
+ //
+ ext.clear();
+ final StringBuffer sb3 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h)gh)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t3 = factory.create( sb3, new NHXParser() )[ 0 ];
+ t3.getNode( "ab" ).setCollapse( true );
+ t3.getNode( "cd" ).setCollapse( true );
+ t3.getNode( "cde" ).setCollapse( true );
+ t3.getNode( "c" ).setCollapse( true );
+ t3.getNode( "d" ).setCollapse( true );
+ t3.getNode( "e" ).setCollapse( true );
+ t3.getNode( "gh" ).setCollapse( true );
+ t3.getNode( "fgh" ).setCollapse( true );
+ n = t3.getNode( "ab" );
+ ext = new ArrayList<PhylogenyNode>();
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( !ext.get( 0 ).getName().equals( "ab" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "cde" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "fgh" ) ) {
+ return false;
+ }
+ //
+ //
+ ext.clear();
+ final StringBuffer sb4 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h)gh)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t4 = factory.create( sb4, new NHXParser() )[ 0 ];
+ t4.getNode( "ab" ).setCollapse( true );
+ t4.getNode( "cd" ).setCollapse( true );
+ t4.getNode( "cde" ).setCollapse( true );
+ t4.getNode( "c" ).setCollapse( true );
+ t4.getNode( "d" ).setCollapse( true );
+ t4.getNode( "e" ).setCollapse( true );
+ t4.getNode( "gh" ).setCollapse( true );
+ t4.getNode( "fgh" ).setCollapse( true );
+ t4.getNode( "abcdefgh" ).setCollapse( true );
+ n = t4.getNode( "abcdefgh" );
+ if ( n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes() != null ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb5 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h))fgh)cdefgh)abcdefgh" );
+ final Phylogeny t5 = factory.create( sb5, new NHXParser() )[ 0 ];
+ ext.clear();
+ n = t5.getFirstExternalNode();
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 8 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "a" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "b" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "c" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "d" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 5 ).getName().equals( "f" ) ) {
+ return false;
+ }
+ if ( !ext.get( 6 ).getName().equals( "g" ) ) {
+ return false;
+ }
+ if ( !ext.get( 7 ).getName().equals( "h" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb6 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h))fgh)cdefgh)abcdefgh" );
+ final Phylogeny t6 = factory.create( sb6, new NHXParser() )[ 0 ];
+ ext.clear();
+ t6.getNode( "ab" ).setCollapse( true );
+ n = t6.getNode( "ab" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 7 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "ab" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "c" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "d" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "f" ) ) {
+ return false;
+ }
+ if ( !ext.get( 5 ).getName().equals( "g" ) ) {
+ return false;
+ }
+ if ( !ext.get( 6 ).getName().equals( "h" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb7 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h))fgh)cdefgh)abcdefgh" );
+ final Phylogeny t7 = factory.create( sb7, new NHXParser() )[ 0 ];
+ ext.clear();
+ t7.getNode( "cd" ).setCollapse( true );
+ n = t7.getNode( "a" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 7 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "a" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "b" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "cd" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "f" ) ) {
+ return false;
+ }
+ if ( !ext.get( 5 ).getName().equals( "g" ) ) {
+ return false;
+ }
+ if ( !ext.get( 6 ).getName().equals( "h" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb8 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h))fgh)cdefgh)abcdefgh" );
+ final Phylogeny t8 = factory.create( sb8, new NHXParser() )[ 0 ];
+ ext.clear();
+ t8.getNode( "cd" ).setCollapse( true );
+ t8.getNode( "c" ).setCollapse( true );
+ t8.getNode( "d" ).setCollapse( true );
+ n = t8.getNode( "a" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 7 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "a" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "b" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "cd" ) ) {
+ System.out.println( "2 fail" );
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "f" ) ) {
+ return false;
+ }
+ if ( !ext.get( 5 ).getName().equals( "g" ) ) {
+ return false;
+ }
+ if ( !ext.get( 6 ).getName().equals( "h" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb9 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h)gh)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t9 = factory.create( sb9, new NHXParser() )[ 0 ];
+ ext.clear();
+ t9.getNode( "gh" ).setCollapse( true );
+ n = t9.getNode( "a" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 7 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "a" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "b" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "c" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "d" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 5 ).getName().equals( "f" ) ) {
+ return false;
+ }
+ if ( !ext.get( 6 ).getName().equals( "gh" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb10 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h)gh)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t10 = factory.create( sb10, new NHXParser() )[ 0 ];
+ ext.clear();
+ t10.getNode( "gh" ).setCollapse( true );
+ t10.getNode( "g" ).setCollapse( true );
+ t10.getNode( "h" ).setCollapse( true );
+ n = t10.getNode( "a" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 7 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "a" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "b" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "c" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "d" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 5 ).getName().equals( "f" ) ) {
+ return false;
+ }
+ if ( !ext.get( 6 ).getName().equals( "gh" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb11 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h)gh)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t11 = factory.create( sb11, new NHXParser() )[ 0 ];
+ ext.clear();
+ t11.getNode( "gh" ).setCollapse( true );
+ t11.getNode( "fgh" ).setCollapse( true );
+ n = t11.getNode( "a" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 6 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "a" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "b" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "c" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "d" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 5 ).getName().equals( "fgh" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb12 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h)gh)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t12 = factory.create( sb12, new NHXParser() )[ 0 ];
+ ext.clear();
+ t12.getNode( "gh" ).setCollapse( true );
+ t12.getNode( "fgh" ).setCollapse( true );
+ t12.getNode( "g" ).setCollapse( true );
+ t12.getNode( "h" ).setCollapse( true );
+ t12.getNode( "f" ).setCollapse( true );
+ n = t12.getNode( "a" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 6 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "a" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "b" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "c" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "d" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 5 ).getName().equals( "fgh" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb13 = new StringBuffer( "((a,b)ab,(((c,d)cd,e)cde,(f,(g,h)gh)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t13 = factory.create( sb13, new NHXParser() )[ 0 ];
+ ext.clear();
+ t13.getNode( "ab" ).setCollapse( true );
+ t13.getNode( "b" ).setCollapse( true );
+ t13.getNode( "fgh" ).setCollapse( true );
+ t13.getNode( "gh" ).setCollapse( true );
+ n = t13.getNode( "ab" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 5 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "ab" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "c" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "d" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "fgh" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb14 = new StringBuffer( "((a,b,0)ab,(((c,d)cd,e)cde,(f,(g,h,1,2)gh,0)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t14 = factory.create( sb14, new NHXParser() )[ 0 ];
+ ext.clear();
+ t14.getNode( "ab" ).setCollapse( true );
+ t14.getNode( "a" ).setCollapse( true );
+ t14.getNode( "fgh" ).setCollapse( true );
+ t14.getNode( "gh" ).setCollapse( true );
+ n = t14.getNode( "ab" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 5 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "ab" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "c" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "d" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "fgh" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb15 = new StringBuffer( "((a,b,0)ab,(((c,d)cd,e)cde,x,(f,(g,h,1,2)gh,0)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t15 = factory.create( sb15, new NHXParser() )[ 0 ];
+ ext.clear();
+ t15.getNode( "ab" ).setCollapse( true );
+ t15.getNode( "a" ).setCollapse( true );
+ t15.getNode( "fgh" ).setCollapse( true );
+ t15.getNode( "gh" ).setCollapse( true );
+ n = t15.getNode( "ab" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 6 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "ab" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "c" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "d" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "e" ) ) {
+ return false;
+ }
+ if ( !ext.get( 4 ).getName().equals( "x" ) ) {
+ return false;
+ }
+ if ( !ext.get( 5 ).getName().equals( "fgh" ) ) {
+ return false;
+ }
+ //
+ //
+ final StringBuffer sb16 = new StringBuffer( "((a,b,0)ab,(((c,d)cd,e)cde,x,(f,(g,h,1,2)gh,0)fgh)cdefgh)abcdefgh" );
+ final Phylogeny t16 = factory.create( sb16, new NHXParser() )[ 0 ];
+ ext.clear();
+ t16.getNode( "ab" ).setCollapse( true );
+ t16.getNode( "a" ).setCollapse( true );
+ t16.getNode( "fgh" ).setCollapse( true );
+ t16.getNode( "gh" ).setCollapse( true );
+ t16.getNode( "cd" ).setCollapse( true );
+ t16.getNode( "cde" ).setCollapse( true );
+ t16.getNode( "d" ).setCollapse( true );
+ t16.getNode( "x" ).setCollapse( true );
+ n = t16.getNode( "ab" );
+ while ( n != null ) {
+ ext.add( n );
+ n = n.getNextExternalNodeWhileTakingIntoAccountCollapsedNodes();
+ }
+ if ( ext.size() != 4 ) {
+ return false;
+ }
+ if ( !ext.get( 0 ).getName().equals( "ab" ) ) {
+ return false;
+ }
+ if ( !ext.get( 1 ).getName().equals( "cde" ) ) {
+ return false;
+ }
+ if ( !ext.get( 2 ).getName().equals( "x" ) ) {
+ return false;
+ }
+ if ( !ext.get( 3 ).getName().equals( "fgh" ) ) {