+ if ( !isEqual( t_b.getNode( "acd" ).getBranchData().getConfidence( 0 ).getValue(), 1 ) ) {
+ return false;
+ }
+ //
+ final Phylogeny t1x = factory.create( "((((A,B)ab,C)abc,D)abcd,E)abcde", new NHXParser() )[ 0 ];
+ final Phylogeny[] ev1x = factory
+ .create( "((((A,B),C),D),E);((A,B),((E,D),C));(((A,B),C),(E,D));(A,(((E,D),C),B));(B,(A,((E,D),C)));(C,((E,D),(A,B)));(D,(E,((A,B),C)));",
+ new NHXParser() );
+ ConfidenceAssessor.evaluate( "bootstrap", ev1x, t1x, true, 1 );
+ if ( !isEqual( t1x.getNode( "ab" ).getBranchData().getConfidence( 0 ).getValue(), 7 ) ) {
+ return false;
+ }
+ if ( !isEqual( t1x.getNode( "abc" ).getBranchData().getConfidence( 0 ).getValue(), 7 ) ) {
+ return false;
+ }
+ final Phylogeny t_bx = factory.create( "((((A,C)ac,D)acd,E)acde,B)abcde", new NHXParser() )[ 0 ];
+ final Phylogeny[] ev_bx = factory
+ .create( "((((A,B),C),D),E);((A,B),((E,D),C));(((A,B),C),(E,D));(A,(((E,D),C),B));(B,(A,((E,D),C)));(C,((E,D),(A,B)));(D,(E,((A,B),C)));((((A,C)ac,D)acd,E)acde,B)abcd",
+ new NHXParser() );
+ ConfidenceAssessor.evaluate( "bootstrap", ev_bx, t_bx, true, 1 );
+ if ( !isEqual( t_bx.getNode( "ac" ).getBranchData().getConfidence( 0 ).getValue(), 1 ) ) {
+ return false;
+ }
+ if ( !isEqual( t_bx.getNode( "acd" ).getBranchData().getConfidence( 0 ).getValue(), 1 ) ) {
+ return false;
+ }
+ //
+ final Phylogeny[] t2 = factory
+ .create( "((((a,b),c),d),e);(((a,b),c),(d,e));(((((a,b),c),d),e),f);((((a,b),c),(d,e)),f);(((a,b),c),d,e);((a,b,c),d,e);",
+ new NHXParser() );
+ final Phylogeny[] ev2 = factory
+ .create( "((((a,b),c),d),e);((((a,b),c),d),e);((((a,b),e),d),c);((((a,b),e),d),c);(((a,b),(c,d)),e);((a,b),x);((a,b),(x,y));(a,b);(a,e);(a,b,c);",
+ new NHXParser() );
+ for( final Phylogeny target : t2 ) {
+ ConfidenceAssessor.evaluate( "bootstrap", ev2, target, false, 1 );
+ }
+ //
+ final Phylogeny t4 = factory.create( "((((((A,B)ab,C)abc,D)abcd,E)abcde,F)abcdef,G)abcdefg",
+ new NHXParser() )[ 0 ];
+ final Phylogeny[] ev4 = factory.create( "(((A,B),C),(X,Y));((F,G),((A,B,C),(D,E)))", new NHXParser() );
+ ConfidenceAssessor.evaluate( "bootstrap", ev4, t4, false, 1 );
+ if ( !isEqual( t4.getNode( "ab" ).getBranchData().getConfidence( 0 ).getValue(), 1 ) ) {
+ return false;
+ }
+ if ( !isEqual( t4.getNode( "abc" ).getBranchData().getConfidence( 0 ).getValue(), 2 ) ) {
+ return false;
+ }
+ if ( !isEqual( t4.getNode( "abcde" ).getBranchData().getConfidence( 0 ).getValue(), 1 ) ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testCopyOfNodeData() {
+ try {
+ final PhylogenyNode n1 = PhylogenyNode
+ .createInstanceFromNhxString( "n5:0.1[&&NHX:S=Ecoli:E=1.1.1.1:D=Y:Co=Y:B=56:T=1:O=22:SO=33:SN=44:W=2:C=10.20.30:XN=S=tag1=value1=unit1]" );
+ final PhylogenyNode n2 = n1.copyNodeData();
+ if ( !n1.toNewHampshireX().equals( n2.toNewHampshireX() ) ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testDataObjects() {
+ try {
+ final Confidence s0 = new Confidence();
+ final Confidence s1 = new Confidence();
+ if ( !s0.isEqual( s1 ) ) {
+ return false;
+ }
+ final Confidence s2 = new Confidence( 0.23, "bootstrap" );
+ final Confidence s3 = new Confidence( 0.23, "bootstrap" );
+ if ( s2.isEqual( s1 ) ) {
+ return false;
+ }
+ if ( !s2.isEqual( s3 ) ) {
+ return false;
+ }
+ final Confidence s4 = ( Confidence ) s3.copy();
+ if ( !s4.isEqual( s3 ) ) {
+ return false;
+ }
+ s3.asSimpleText();
+ s3.asText();
+ // Taxonomy
+ // ----------
+ final Taxonomy t1 = new Taxonomy();
+ final Taxonomy t2 = new Taxonomy();
+ final Taxonomy t3 = new Taxonomy();
+ final Taxonomy t4 = new Taxonomy();
+ final Taxonomy t5 = new Taxonomy();
+ t1.setIdentifier( new Identifier( "ecoli" ) );
+ t1.setTaxonomyCode( "ECOLI" );
+ t1.setScientificName( "E. coli" );
+ t1.setCommonName( "coli" );
+ final Taxonomy t0 = ( Taxonomy ) t1.copy();
+ if ( !t1.isEqual( t0 ) ) {
+ return false;
+ }
+ t2.setIdentifier( new Identifier( "ecoli" ) );
+ t2.setTaxonomyCode( "OTHER" );
+ t2.setScientificName( "what" );
+ t2.setCommonName( "something" );
+ if ( !t1.isEqual( t2 ) ) {
+ return false;
+ }
+ t2.setIdentifier( new Identifier( "nemve" ) );
+ if ( t1.isEqual( t2 ) ) {
+ return false;
+ }
+ t1.setIdentifier( null );
+ t3.setTaxonomyCode( "ECOLI" );
+ t3.setScientificName( "what" );
+ t3.setCommonName( "something" );
+ if ( !t1.isEqual( t3 ) ) {
+ return false;
+ }
+ t1.setIdentifier( null );
+ t1.setTaxonomyCode( "" );
+ t4.setScientificName( "E. ColI" );
+ t4.setCommonName( "something" );
+ if ( !t1.isEqual( t4 ) ) {
+ return false;
+ }
+ t4.setScientificName( "B. subtilis" );
+ t4.setCommonName( "something" );
+ if ( t1.isEqual( t4 ) ) {
+ return false;
+ }
+ t1.setIdentifier( null );
+ t1.setTaxonomyCode( "" );
+ t1.setScientificName( "" );
+ t5.setCommonName( "COLI" );
+ if ( !t1.isEqual( t5 ) ) {
+ return false;
+ }
+ t5.setCommonName( "vibrio" );
+ if ( t1.isEqual( t5 ) ) {
+ return false;
+ }
+ // Identifier
+ // ----------
+ final Identifier id0 = new Identifier( "123", "pfam" );
+ final Identifier id1 = ( Identifier ) id0.copy();
+ if ( !id1.isEqual( id1 ) ) {
+ return false;
+ }
+ if ( !id1.isEqual( id0 ) ) {
+ return false;
+ }
+ if ( !id0.isEqual( id1 ) ) {
+ return false;
+ }
+ id1.asSimpleText();
+ id1.asText();
+ // ProteinDomain
+ // ---------------
+ final ProteinDomain pd0 = new ProteinDomain( "abc", 100, 200 );
+ final ProteinDomain pd1 = ( ProteinDomain ) pd0.copy();
+ if ( !pd1.isEqual( pd1 ) ) {
+ return false;
+ }
+ if ( !pd1.isEqual( pd0 ) ) {
+ return false;
+ }
+ pd1.asSimpleText();
+ pd1.asText();
+ final ProteinDomain pd2 = new ProteinDomain( pd0.getName(), pd0.getFrom(), pd0.getTo(), "id" );
+ final ProteinDomain pd3 = ( ProteinDomain ) pd2.copy();
+ if ( !pd3.isEqual( pd3 ) ) {
+ return false;
+ }
+ if ( !pd2.isEqual( pd3 ) ) {
+ return false;
+ }
+ if ( !pd0.isEqual( pd3 ) ) {
+ return false;
+ }
+ pd3.asSimpleText();
+ pd3.asText();
+ // DomainArchitecture
+ // ------------------
+ final ProteinDomain d0 = new ProteinDomain( "domain0", 10, 20 );
+ final ProteinDomain d1 = new ProteinDomain( "domain1", 30, 40 );
+ final ProteinDomain d2 = new ProteinDomain( "domain2", 50, 60 );
+ final ProteinDomain d3 = new ProteinDomain( "domain3", 70, 80 );
+ final ProteinDomain d4 = new ProteinDomain( "domain4", 90, 100 );
+ final ArrayList<PhylogenyData> domains0 = new ArrayList<PhylogenyData>();
+ domains0.add( d2 );
+ domains0.add( d0 );
+ domains0.add( d3 );
+ domains0.add( d1 );
+ final DomainArchitecture ds0 = new DomainArchitecture( domains0, 110 );
+ if ( ds0.getNumberOfDomains() != 4 ) {
+ return false;
+ }
+ final DomainArchitecture ds1 = ( DomainArchitecture ) ds0.copy();
+ if ( !ds0.isEqual( ds0 ) ) {
+ return false;
+ }
+ if ( !ds0.isEqual( ds1 ) ) {
+ return false;
+ }
+ if ( ds1.getNumberOfDomains() != 4 ) {
+ return false;
+ }
+ final ArrayList<PhylogenyData> domains1 = new ArrayList<PhylogenyData>();
+ domains1.add( d1 );
+ domains1.add( d2 );
+ domains1.add( d4 );
+ domains1.add( d0 );
+ final DomainArchitecture ds2 = new DomainArchitecture( domains1, 200 );
+ if ( ds0.isEqual( ds2 ) ) {
+ return false;
+ }
+ ds1.asSimpleText();
+ ds1.asText();
+ ds1.toNHX();
+ final DomainArchitecture ds3 = new DomainArchitecture( "120>30>40>0.9>b>50>60>0.4>c>10>20>0.1>a" );
+ if ( !ds3.toNHX().toString().equals( ":DS=120>10>20>0.1>a>30>40>0.9>b>50>60>0.4>c" ) ) {
+ System.out.println( ds3.toNHX() );
+ return false;
+ }
+ if ( ds3.getNumberOfDomains() != 3 ) {
+ return false;
+ }
+ // Event
+ // -----
+ final Event e1 = new Event( Event.EventType.fusion );
+ if ( e1.isDuplication() ) {
+ return false;
+ }
+ if ( !e1.isFusion() ) {
+ return false;
+ }
+ if ( !e1.asText().toString().equals( "fusion" ) ) {
+ return false;
+ }
+ if ( !e1.asSimpleText().toString().equals( "fusion" ) ) {
+ return false;
+ }
+ final Event e11 = new Event( Event.EventType.fusion );
+ if ( !e11.isEqual( e1 ) ) {
+ return false;
+ }
+ if ( !e11.toNHX().toString().equals( "" ) ) {
+ return false;
+ }
+ final Event e2 = new Event( Event.EventType.speciation_or_duplication );
+ if ( e2.isDuplication() ) {
+ return false;
+ }
+ if ( !e2.isSpeciationOrDuplication() ) {
+ return false;
+ }
+ if ( !e2.asText().toString().equals( "speciation_or_duplication" ) ) {
+ return false;
+ }
+ if ( !e2.asSimpleText().toString().equals( "?" ) ) {
+ return false;
+ }
+ if ( !e2.toNHX().toString().equals( ":D=?" ) ) {
+ return false;
+ }
+ if ( e11.isEqual( e2 ) ) {
+ return false;
+ }
+ final Event e2c = ( Event ) e2.copy();
+ if ( !e2c.isEqual( e2 ) ) {
+ return false;
+ }
+ Event e3 = new Event( 1, 2, 3 );
+ if ( e3.isDuplication() ) {
+ return false;
+ }
+ if ( e3.isSpeciation() ) {
+ return false;
+ }
+ if ( e3.isGeneLoss() ) {
+ return false;
+ }
+ if ( !e3.asText().toString().equals( "duplications [1] speciations [2] gene-losses [3]" ) ) {
+ return false;
+ }
+ final Event e3c = ( Event ) e3.copy();
+ final Event e3cc = ( Event ) e3c.copy();
+ if ( !e3c.asSimpleText().toString().equals( "D2S3L" ) ) {
+ return false;
+ }
+ e3 = null;
+ if ( !e3c.isEqual( e3cc ) ) {
+ return false;
+ }
+ Event e4 = new Event( 1, 2, 3 );
+ if ( !e4.asText().toString().equals( "duplications [1] speciations [2] gene-losses [3]" ) ) {
+ return false;
+ }
+ if ( !e4.asSimpleText().toString().equals( "D2S3L" ) ) {
+ return false;
+ }
+ final Event e4c = ( Event ) e4.copy();
+ e4 = null;
+ final Event e4cc = ( Event ) e4c.copy();
+ if ( !e4cc.asText().toString().equals( "duplications [1] speciations [2] gene-losses [3]" ) ) {
+ return false;
+ }
+ if ( !e4c.isEqual( e4cc ) ) {
+ return false;
+ }
+ final Event e5 = new Event();
+ if ( !e5.isUnassigned() ) {
+ return false;
+ }
+ if ( !e5.asText().toString().equals( "unassigned" ) ) {
+ return false;
+ }
+ if ( !e5.asSimpleText().toString().equals( "" ) ) {
+ return false;
+ }
+ final Event e6 = new Event( 1, 0, 0 );
+ if ( !e6.asText().toString().equals( "duplication" ) ) {
+ return false;
+ }
+ if ( !e6.asSimpleText().toString().equals( "D" ) ) {
+ return false;
+ }
+ final Event e7 = new Event( 0, 1, 0 );
+ if ( !e7.asText().toString().equals( "speciation" ) ) {
+ return false;
+ }
+ if ( !e7.asSimpleText().toString().equals( "S" ) ) {
+ return false;
+ }
+ final Event e8 = new Event( 0, 0, 1 );
+ if ( !e8.asText().toString().equals( "gene-loss" ) ) {
+ return false;
+ }
+ if ( !e8.asSimpleText().toString().equals( "L" ) ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testDeletionOfExternalNodes() {
+ try {
+ final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+ final Phylogeny t0 = factory.create( "A", new NHXParser() )[ 0 ];
+ final PhylogenyWriter w = new PhylogenyWriter();
+ if ( t0.isEmpty() ) {
+ return false;
+ }
+ if ( t0.getNumberOfExternalNodes() != 1 ) {
+ return false;
+ }
+ t0.deleteSubtree( t0.getNode( "A" ), false );
+ if ( t0.getNumberOfExternalNodes() != 0 ) {
+ return false;
+ }
+ if ( !t0.isEmpty() ) {
+ return false;
+ }
+ final Phylogeny t1 = factory.create( "(A,B)r", new NHXParser() )[ 0 ];
+ if ( t1.getNumberOfExternalNodes() != 2 ) {
+ return false;
+ }
+ t1.deleteSubtree( t1.getNode( "A" ), false );
+ if ( t1.getNumberOfExternalNodes() != 1 ) {
+ return false;
+ }
+ if ( !t1.getNode( "B" ).getName().equals( "B" ) ) {
+ return false;
+ }
+ t1.deleteSubtree( t1.getNode( "B" ), false );
+ if ( t1.getNumberOfExternalNodes() != 1 ) {
+ return false;
+ }
+ t1.deleteSubtree( t1.getNode( "r" ), false );
+ if ( !t1.isEmpty() ) {
+ return false;
+ }
+ final Phylogeny t2 = factory.create( "((A,B),C)", new NHXParser() )[ 0 ];
+ if ( t2.getNumberOfExternalNodes() != 3 ) {
+ return false;
+ }
+ t2.deleteSubtree( t2.getNode( "B" ), false );
+ if ( t2.getNumberOfExternalNodes() != 2 ) {
+ return false;
+ }
+ t2.toNewHampshireX();
+ PhylogenyNode n = t2.getNode( "A" );
+ if ( !n.getNextExternalNode().getName().equals( "C" ) ) {
+ return false;
+ }
+ t2.deleteSubtree( t2.getNode( "A" ), false );
+ if ( t2.getNumberOfExternalNodes() != 2 ) {
+ return false;
+ }
+ t2.deleteSubtree( t2.getNode( "C" ), true );
+ if ( t2.getNumberOfExternalNodes() != 1 ) {
+ return false;
+ }
+ final Phylogeny t3 = factory.create( "((A,B),(C,D))", new NHXParser() )[ 0 ];
+ if ( t3.getNumberOfExternalNodes() != 4 ) {
+ return false;
+ }
+ t3.deleteSubtree( t3.getNode( "B" ), true );
+ if ( t3.getNumberOfExternalNodes() != 3 ) {
+ return false;
+ }
+ n = t3.getNode( "A" );
+ if ( !n.getNextExternalNode().getName().equals( "C" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getNextExternalNode().getName().equals( "D" ) ) {
+ return false;
+ }
+ t3.deleteSubtree( t3.getNode( "A" ), true );
+ if ( t3.getNumberOfExternalNodes() != 2 ) {
+ return false;
+ }
+ n = t3.getNode( "C" );
+ if ( !n.getNextExternalNode().getName().equals( "D" ) ) {
+ return false;
+ }
+ t3.deleteSubtree( t3.getNode( "C" ), true );
+ if ( t3.getNumberOfExternalNodes() != 1 ) {
+ return false;
+ }
+ t3.deleteSubtree( t3.getNode( "D" ), true );
+ if ( t3.getNumberOfExternalNodes() != 0 ) {
+ return false;
+ }
+ final Phylogeny t4 = factory.create( "((A,((B11,B12),B2)),(C,D))", new NHXParser() )[ 0 ];
+ if ( t4.getNumberOfExternalNodes() != 6 ) {
+ return false;
+ }
+ t4.deleteSubtree( t4.getNode( "B2" ), true );
+ if ( t4.getNumberOfExternalNodes() != 5 ) {
+ return false;
+ }
+ String s = w.toNewHampshire( t4, false, true ).toString();
+ if ( !s.equals( "((A,(B11,B12)),(C,D));" ) ) {
+ return false;
+ }
+ t4.deleteSubtree( t4.getNode( "B11" ), true );
+ if ( t4.getNumberOfExternalNodes() != 4 ) {
+ return false;
+ }
+ t4.deleteSubtree( t4.getNode( "C" ), true );
+ if ( t4.getNumberOfExternalNodes() != 3 ) {
+ return false;
+ }
+ n = t4.getNode( "A" );
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "B12" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "D" ) ) {
+ return false;
+ }
+ s = w.toNewHampshire( t4, false, true ).toString();
+ if ( !s.equals( "((A,B12),D);" ) ) {
+ return false;
+ }
+ final Phylogeny t5 = factory.create( "((A,((B11,B12),B2)),(C,D))", new NHXParser() )[ 0 ];
+ t5.deleteSubtree( t5.getNode( "A" ), true );
+ if ( t5.getNumberOfExternalNodes() != 5 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t5, false, true ).toString();
+ if ( !s.equals( "(((B11,B12),B2),(C,D));" ) ) {
+ return false;
+ }
+ final Phylogeny t6 = factory.create( "((A,((B11,B12),B2)),(C,D))", new NHXParser() )[ 0 ];
+ t6.deleteSubtree( t6.getNode( "B11" ), true );
+ if ( t6.getNumberOfExternalNodes() != 5 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t6, false, false ).toString();
+ if ( !s.equals( "((A,(B12,B2)),(C,D));" ) ) {
+ return false;
+ }
+ final Phylogeny t7 = factory.create( "((A,((B11,B12),B2)),(C,D))", new NHXParser() )[ 0 ];
+ t7.deleteSubtree( t7.getNode( "B12" ), true );
+ if ( t7.getNumberOfExternalNodes() != 5 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t7, false, true ).toString();
+ if ( !s.equals( "((A,(B11,B2)),(C,D));" ) ) {
+ return false;
+ }
+ final Phylogeny t8 = factory.create( "((A,((B11,B12),B2)),(C,D))", new NHXParser() )[ 0 ];
+ t8.deleteSubtree( t8.getNode( "B2" ), true );
+ if ( t8.getNumberOfExternalNodes() != 5 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t8, false, false ).toString();
+ if ( !s.equals( "((A,(B11,B12)),(C,D));" ) ) {
+ return false;
+ }
+ final Phylogeny t9 = factory.create( "((A,((B11,B12),B2)),(C,D))", new NHXParser() )[ 0 ];
+ t9.deleteSubtree( t9.getNode( "C" ), true );
+ if ( t9.getNumberOfExternalNodes() != 5 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t9, false, true ).toString();
+ if ( !s.equals( "((A,((B11,B12),B2)),D);" ) ) {
+ return false;
+ }
+ final Phylogeny t10 = factory.create( "((A,((B11,B12),B2)),(C,D))", new NHXParser() )[ 0 ];
+ t10.deleteSubtree( t10.getNode( "D" ), true );
+ if ( t10.getNumberOfExternalNodes() != 5 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t10, false, true ).toString();
+ if ( !s.equals( "((A,((B11,B12),B2)),C);" ) ) {
+ return false;
+ }
+ final Phylogeny t11 = factory.create( "(A,B,C)", new NHXParser() )[ 0 ];
+ t11.deleteSubtree( t11.getNode( "A" ), true );
+ if ( t11.getNumberOfExternalNodes() != 2 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t11, false, true ).toString();
+ if ( !s.equals( "(B,C);" ) ) {
+ return false;
+ }
+ t11.deleteSubtree( t11.getNode( "C" ), true );
+ if ( t11.getNumberOfExternalNodes() != 1 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t11, false, false ).toString();
+ if ( !s.equals( "B;" ) ) {
+ return false;
+ }
+ final Phylogeny t12 = factory.create( "((A1,A2,A3),(B1,B2,B3),(C1,C2,C3))", new NHXParser() )[ 0 ];
+ t12.deleteSubtree( t12.getNode( "B2" ), true );
+ if ( t12.getNumberOfExternalNodes() != 8 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t12, false, true ).toString();
+ if ( !s.equals( "((A1,A2,A3),(B1,B3),(C1,C2,C3));" ) ) {
+ return false;
+ }
+ t12.deleteSubtree( t12.getNode( "B3" ), true );
+ if ( t12.getNumberOfExternalNodes() != 7 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t12, false, true ).toString();
+ if ( !s.equals( "((A1,A2,A3),B1,(C1,C2,C3));" ) ) {
+ return false;
+ }
+ t12.deleteSubtree( t12.getNode( "C3" ), true );
+ if ( t12.getNumberOfExternalNodes() != 6 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t12, false, true ).toString();
+ if ( !s.equals( "((A1,A2,A3),B1,(C1,C2));" ) ) {
+ return false;
+ }
+ t12.deleteSubtree( t12.getNode( "A1" ), true );
+ if ( t12.getNumberOfExternalNodes() != 5 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t12, false, true ).toString();
+ if ( !s.equals( "((A2,A3),B1,(C1,C2));" ) ) {
+ return false;
+ }
+ t12.deleteSubtree( t12.getNode( "B1" ), true );
+ if ( t12.getNumberOfExternalNodes() != 4 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t12, false, true ).toString();
+ if ( !s.equals( "((A2,A3),(C1,C2));" ) ) {
+ return false;
+ }
+ t12.deleteSubtree( t12.getNode( "A3" ), true );
+ if ( t12.getNumberOfExternalNodes() != 3 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t12, false, true ).toString();
+ if ( !s.equals( "(A2,(C1,C2));" ) ) {
+ return false;
+ }
+ t12.deleteSubtree( t12.getNode( "A2" ), true );
+ if ( t12.getNumberOfExternalNodes() != 2 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t12, false, true ).toString();
+ if ( !s.equals( "(C1,C2);" ) ) {
+ return false;
+ }
+ final Phylogeny t13 = factory.create( "(A,B,C,(D:1.0,E:2.0):3.0)", new NHXParser() )[ 0 ];
+ t13.deleteSubtree( t13.getNode( "D" ), true );
+ if ( t13.getNumberOfExternalNodes() != 4 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t13, false, true ).toString();
+ if ( !s.equals( "(A,B,C,E:5.0);" ) ) {
+ return false;
+ }
+ final Phylogeny t14 = factory.create( "((A,B,C,(D:0.1,E:0.4):1.0),F)", new NHXParser() )[ 0 ];
+ t14.deleteSubtree( t14.getNode( "E" ), true );
+ if ( t14.getNumberOfExternalNodes() != 5 ) {
+ return false;
+ }
+ s = w.toNewHampshire( t14, false, true ).toString();
+ if ( !s.equals( "((A,B,C,D:1.1),F);" ) ) {
+ return false;
+ }
+ final Phylogeny t15 = factory.create( "((A1,A2,A3,A4),(B1,B2,B3,B4),(C1,C2,C3,C4))", new NHXParser() )[ 0 ];
+ t15.deleteSubtree( t15.getNode( "B2" ), true );
+ if ( t15.getNumberOfExternalNodes() != 11 ) {
+ return false;
+ }
+ t15.deleteSubtree( t15.getNode( "B1" ), true );
+ if ( t15.getNumberOfExternalNodes() != 10 ) {
+ return false;
+ }
+ t15.deleteSubtree( t15.getNode( "B3" ), true );
+ if ( t15.getNumberOfExternalNodes() != 9 ) {
+ return false;
+ }
+ t15.deleteSubtree( t15.getNode( "B4" ), true );
+ if ( t15.getNumberOfExternalNodes() != 8 ) {
+ return false;
+ }
+ t15.deleteSubtree( t15.getNode( "A1" ), true );
+ if ( t15.getNumberOfExternalNodes() != 7 ) {
+ return false;
+ }
+ t15.deleteSubtree( t15.getNode( "C4" ), true );
+ if ( t15.getNumberOfExternalNodes() != 6 ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testDescriptiveStatistics() {
+ try {
+ final DescriptiveStatistics dss1 = new BasicDescriptiveStatistics();
+ dss1.addValue( 82 );
+ dss1.addValue( 78 );
+ dss1.addValue( 70 );
+ dss1.addValue( 58 );
+ dss1.addValue( 42 );
+ if ( dss1.getN() != 5 ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.getMin(), 42 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.getMax(), 82 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.arithmeticMean(), 66 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.sampleStandardDeviation(), 16.24807680927192 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.median(), 70 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.midrange(), 62 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.sampleVariance(), 264 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.pearsonianSkewness(), -0.7385489458759964 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.coefficientOfVariation(), 0.24618298195866547 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.sampleStandardUnit( 66 - 16.24807680927192 ), -1.0 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.getValue( 1 ), 78 ) ) {
+ return false;
+ }
+ dss1.addValue( 123 );
+ if ( !Test.isEqual( dss1.arithmeticMean(), 75.5 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.getMax(), 123 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss1.standardErrorOfMean(), 11.200446419674531 ) ) {
+ return false;
+ }
+ final DescriptiveStatistics dss2 = new BasicDescriptiveStatistics();
+ dss2.addValue( -1.85 );
+ dss2.addValue( 57.5 );
+ dss2.addValue( 92.78 );
+ dss2.addValue( 57.78 );
+ if ( !Test.isEqual( dss2.median(), 57.64 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss2.sampleStandardDeviation(), 39.266984753946495 ) ) {
+ return false;
+ }
+ final double[] a = dss2.getDataAsDoubleArray();
+ if ( !Test.isEqual( a[ 3 ], 57.78 ) ) {
+ return false;
+ }
+ dss2.addValue( -100 );
+ if ( !Test.isEqual( dss2.sampleStandardDeviation(), 75.829111296388 ) ) {
+ return false;
+ }
+ if ( !Test.isEqual( dss2.sampleVariance(), 5750.05412 ) ) {
+ return false;
+ }
+ final double[] ds = new double[ 14 ];
+ ds[ 0 ] = 34;
+ ds[ 1 ] = 23;
+ ds[ 2 ] = 1;
+ ds[ 3 ] = 32;
+ ds[ 4 ] = 11;
+ ds[ 5 ] = 2;
+ ds[ 6 ] = 12;
+ ds[ 7 ] = 33;
+ ds[ 8 ] = 13;
+ ds[ 9 ] = 22;
+ ds[ 10 ] = 21;
+ ds[ 11 ] = 35;
+ ds[ 12 ] = 24;
+ ds[ 13 ] = 31;
+ final int[] bins = BasicDescriptiveStatistics.performBinning( ds, 0, 40, 4 );
+ if ( bins.length != 4 ) {
+ return false;
+ }
+ if ( bins[ 0 ] != 2 ) {
+ return false;
+ }
+ if ( bins[ 1 ] != 3 ) {
+ return false;
+ }
+ if ( bins[ 2 ] != 4 ) {
+ return false;
+ }
+ if ( bins[ 3 ] != 5 ) {
+ return false;
+ }
+ final double[] ds1 = new double[ 9 ];
+ ds1[ 0 ] = 10.0;
+ ds1[ 1 ] = 19.0;
+ ds1[ 2 ] = 9.999;
+ ds1[ 3 ] = 0.0;
+ ds1[ 4 ] = 39.9;
+ ds1[ 5 ] = 39.999;
+ ds1[ 6 ] = 30.0;
+ ds1[ 7 ] = 19.999;
+ ds1[ 8 ] = 30.1;
+ final int[] bins1 = BasicDescriptiveStatistics.performBinning( ds1, 0, 40, 4 );
+ if ( bins1.length != 4 ) {
+ return false;
+ }
+ if ( bins1[ 0 ] != 2 ) {
+ return false;
+ }
+ if ( bins1[ 1 ] != 3 ) {
+ return false;
+ }
+ if ( bins1[ 2 ] != 0 ) {
+ return false;
+ }
+ if ( bins1[ 3 ] != 4 ) {
+ return false;
+ }
+ final int[] bins1_1 = BasicDescriptiveStatistics.performBinning( ds1, 0, 40, 3 );
+ if ( bins1_1.length != 3 ) {
+ return false;
+ }
+ if ( bins1_1[ 0 ] != 3 ) {
+ return false;
+ }
+ if ( bins1_1[ 1 ] != 2 ) {
+ return false;
+ }
+ if ( bins1_1[ 2 ] != 4 ) {
+ return false;
+ }
+ final int[] bins1_2 = BasicDescriptiveStatistics.performBinning( ds1, 1, 39, 3 );
+ if ( bins1_2.length != 3 ) {
+ return false;
+ }
+ if ( bins1_2[ 0 ] != 2 ) {
+ return false;
+ }
+ if ( bins1_2[ 1 ] != 2 ) {
+ return false;
+ }
+ if ( bins1_2[ 2 ] != 2 ) {
+ return false;
+ }
+ final DescriptiveStatistics dss3 = new BasicDescriptiveStatistics();
+ dss3.addValue( 1 );
+ dss3.addValue( 1 );
+ dss3.addValue( 1 );
+ dss3.addValue( 2 );
+ dss3.addValue( 3 );
+ dss3.addValue( 4 );
+ dss3.addValue( 5 );
+ dss3.addValue( 5 );
+ dss3.addValue( 5 );
+ dss3.addValue( 6 );
+ dss3.addValue( 7 );
+ dss3.addValue( 8 );
+ dss3.addValue( 9 );
+ dss3.addValue( 10 );
+ dss3.addValue( 10 );
+ dss3.addValue( 10 );
+ final AsciiHistogram histo = new AsciiHistogram( dss3 );
+ histo.toStringBuffer( 10, '=', 40, 5 );
+ histo.toStringBuffer( 3, 8, 10, '=', 40, 5, null );
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testDir( final String file ) {
+ try {
+ final File f = new File( file );
+ if ( !f.exists() ) {
+ return false;
+ }
+ if ( !f.isDirectory() ) {
+ return false;
+ }
+ if ( !f.canRead() ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testExternalNodeRelatedMethods() {
+ try {
+ final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+ final Phylogeny t1 = factory.create( "((A,B),(C,D))", new NHXParser() )[ 0 ];
+ PhylogenyNode n = t1.getNode( "A" );
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "B" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "C" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "D" ) ) {
+ return false;
+ }
+ n = t1.getNode( "B" );
+ while ( !n.isLastExternalNode() ) {
+ n = n.getNextExternalNode();
+ }
+ final Phylogeny t2 = factory.create( "(((A,B),C),D)", new NHXParser() )[ 0 ];
+ n = t2.getNode( "A" );
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "B" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "C" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "D" ) ) {
+ return false;
+ }
+ n = t2.getNode( "B" );
+ while ( !n.isLastExternalNode() ) {
+ n = n.getNextExternalNode();
+ }
+ final Phylogeny t3 = factory.create( "(((A,B),(C,D)),((E,F),(G,H)))", new NHXParser() )[ 0 ];
+ n = t3.getNode( "A" );
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "B" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "C" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "D" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "E" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "F" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "G" ) ) {
+ return false;
+ }
+ n = n.getNextExternalNode();
+ if ( !n.getName().equals( "H" ) ) {
+ return false;
+ }
+ n = t3.getNode( "B" );
+ while ( !n.isLastExternalNode() ) {
+ n = n.getNextExternalNode();
+ }
+ final Phylogeny t4 = factory.create( "((A,B),(C,D))", new NHXParser() )[ 0 ];
+ for( final PhylogenyNodeIterator iter = t4.iteratorExternalForward(); iter.hasNext(); ) {
+ final PhylogenyNode node = iter.next();
+ }
+ final Phylogeny t5 = factory.create( "(((A,B),(C,D)),((E,F),(G,H)))", new NHXParser() )[ 0 ];
+ for( final PhylogenyNodeIterator iter = t5.iteratorExternalForward(); iter.hasNext(); ) {
+ final PhylogenyNode node = iter.next();
+ }
+ final Phylogeny t6 = factory.create( "((((((A))),(((B))),((C)),((((D)))),E)),((F)))", new NHXParser() )[ 0 ];
+ final PhylogenyNodeIterator iter = t6.iteratorExternalForward();
+ if ( !iter.next().getName().equals( "A" ) ) {
+ return false;
+ }
+ if ( !iter.next().getName().equals( "B" ) ) {
+ return false;
+ }
+ if ( !iter.next().getName().equals( "C" ) ) {
+ return false;
+ }
+ if ( !iter.next().getName().equals( "D" ) ) {
+ return false;
+ }
+ if ( !iter.next().getName().equals( "E" ) ) {
+ return false;
+ }
+ if ( !iter.next().getName().equals( "F" ) ) {
+ return false;
+ }
+ if ( iter.hasNext() ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testGeneralTable() {
+ try {
+ final GeneralTable<Integer, String> t0 = new GeneralTable<Integer, String>();
+ t0.setValue( 3, 2, "23" );
+ t0.setValue( 10, 1, "error" );
+ t0.setValue( 10, 1, "110" );
+ t0.setValue( 9, 1, "19" );
+ t0.setValue( 1, 10, "101" );
+ t0.setValue( 10, 10, "1010" );
+ t0.setValue( 100, 10, "10100" );
+ t0.setValue( 0, 0, "00" );
+ if ( !t0.getValue( 3, 2 ).equals( "23" ) ) {
+ return false;
+ }
+ if ( !t0.getValue( 10, 1 ).equals( "110" ) ) {
+ return false;
+ }
+ if ( !t0.getValueAsString( 1, 10 ).equals( "101" ) ) {
+ return false;
+ }
+ if ( !t0.getValueAsString( 10, 10 ).equals( "1010" ) ) {
+ return false;
+ }
+ if ( !t0.getValueAsString( 100, 10 ).equals( "10100" ) ) {
+ return false;
+ }
+ if ( !t0.getValueAsString( 9, 1 ).equals( "19" ) ) {
+ return false;
+ }
+ if ( !t0.getValueAsString( 0, 0 ).equals( "00" ) ) {
+ return false;
+ }
+ if ( !t0.getValueAsString( 49, 4 ).equals( "" ) ) {
+ return false;
+ }
+ if ( !t0.getValueAsString( 22349, 3434344 ).equals( "" ) ) {
+ return false;
+ }
+ final GeneralTable<String, String> t1 = new GeneralTable<String, String>();
+ t1.setValue( "3", "2", "23" );
+ t1.setValue( "10", "1", "error" );
+ t1.setValue( "10", "1", "110" );
+ t1.setValue( "9", "1", "19" );
+ t1.setValue( "1", "10", "101" );
+ t1.setValue( "10", "10", "1010" );
+ t1.setValue( "100", "10", "10100" );
+ t1.setValue( "0", "0", "00" );
+ t1.setValue( "qwerty", "zxcvbnm", "asdef" );
+ if ( !t1.getValue( "3", "2" ).equals( "23" ) ) {
+ return false;
+ }
+ if ( !t1.getValue( "10", "1" ).equals( "110" ) ) {
+ return false;
+ }
+ if ( !t1.getValueAsString( "1", "10" ).equals( "101" ) ) {
+ return false;
+ }
+ if ( !t1.getValueAsString( "10", "10" ).equals( "1010" ) ) {
+ return false;
+ }
+ if ( !t1.getValueAsString( "100", "10" ).equals( "10100" ) ) {
+ return false;
+ }
+ if ( !t1.getValueAsString( "9", "1" ).equals( "19" ) ) {
+ return false;
+ }
+ if ( !t1.getValueAsString( "0", "0" ).equals( "00" ) ) {
+ return false;
+ }
+ if ( !t1.getValueAsString( "qwerty", "zxcvbnm" ).equals( "asdef" ) ) {
+ return false;
+ }
+ if ( !t1.getValueAsString( "49", "4" ).equals( "" ) ) {
+ return false;
+ }
+ if ( !t1.getValueAsString( "22349", "3434344" ).equals( "" ) ) {
+ return false;
+ }
+ }
+ catch ( final Exception e ) {
+ e.printStackTrace( System.out );
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean testGetDistance() {
+ try {
+ final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+ final Phylogeny p1 = factory.create( "(((A:1,B:2,X:100)ab:3,C:4)abc:5,(D:7,(E:9,F:10)ef:8)def:6)r",
+ new NHXParser() )[ 0 ];
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "C" ), p1.getNode( "C" ) ) != 0 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "def" ), p1.getNode( "def" ) ) != 0 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "ef" ), p1.getNode( "ef" ) ) != 0 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "r" ), p1.getNode( "r" ) ) != 0 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "A" ) ) != 0 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "B" ) ) != 3 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "B" ), p1.getNode( "A" ) ) != 3 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "C" ) ) != 8 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "C" ), p1.getNode( "A" ) ) != 8 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "D" ) ) != 22 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "E" ) ) != 32 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "E" ), p1.getNode( "A" ) ) != 32 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "F" ) ) != 33 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "F" ), p1.getNode( "A" ) ) != 33 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "ab" ) ) != 1 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "ab" ), p1.getNode( "A" ) ) != 1 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "abc" ) ) != 4 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "abc" ), p1.getNode( "A" ) ) != 4 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "r" ) ) != 9 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "r" ), p1.getNode( "A" ) ) != 9 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "def" ) ) != 15 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "def" ), p1.getNode( "A" ) ) != 15 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "A" ), p1.getNode( "ef" ) ) != 23 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "ef" ), p1.getNode( "A" ) ) != 23 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "ef" ), p1.getNode( "def" ) ) != 8 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "def" ), p1.getNode( "ef" ) ) != 8 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "ef" ), p1.getNode( "r" ) ) != 14 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "ef" ), p1.getNode( "abc" ) ) != 19 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "ef" ), p1.getNode( "ab" ) ) != 22 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "ab" ), p1.getNode( "ef" ) ) != 22 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p1.getNode( "def" ), p1.getNode( "abc" ) ) != 11 ) {
+ return false;
+ }
+ final Phylogeny p2 = factory.create( "((A:4,B:5,C:6)abc:1,(D:7,E:8,F:9)def:2,(G:10,H:11,I:12)ghi:3)r",
+ new NHXParser() )[ 0 ];
+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "A" ), p2.getNode( "B" ) ) != 9 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "A" ), p2.getNode( "C" ) ) != 10 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "A" ), p2.getNode( "D" ) ) != 14 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "A" ), p2.getNode( "ghi" ) ) != 8 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "A" ), p2.getNode( "I" ) ) != 20 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "G" ), p2.getNode( "ghi" ) ) != 10 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "r" ), p2.getNode( "r" ) ) != 0 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "r" ), p2.getNode( "G" ) ) != 13 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "G" ), p2.getNode( "r" ) ) != 13 ) {
+ return false;
+ }
+ if ( PhylogenyMethods.calculateDistance( p2.getNode( "G" ), p2.getNode( "H" ) ) != 21 ) {
+ return false;
+ }
+ 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" ) ) {