JAL-2797 standalone and embedded implementations of AptxFrame
[jalview.git] / forester / java / src / org / forester / test / Test.java
index fe52a87..bbe2591 100644 (file)
@@ -44,6 +44,7 @@ import org.forester.application.support_transfer;
 import org.forester.archaeopteryx.AptxUtil;
 import org.forester.archaeopteryx.TreePanelUtil;
 import org.forester.archaeopteryx.webservices.WebserviceUtil;
+import org.forester.clade_analysis.CladeAnalysisTest;
 import org.forester.development.DevelopmentTools;
 import org.forester.evoinference.TestPhylogenyReconstruction;
 import org.forester.evoinference.matrix.character.CharacterStateMatrix;
@@ -218,6 +219,33 @@ public final class Test {
             succeeded++;
         }
         System.out.println( "OK." );
+        System.out.print( "Common prefix: " );
+        if ( !testCommonPrefix() ) {
+            System.out.println( "failed." );
+            failed++;
+        }
+        else {
+            succeeded++;
+        }
+        System.out.println( "OK." );
+        System.out.print( "Common prefix sep: " );
+        if ( !testCommonPrefixSep() ) {
+            System.out.println( "failed." );
+            failed++;
+        }
+        else {
+            succeeded++;
+        }
+        System.out.println( "OK." );
+        System.out.print( "Contains prefix: " );
+        if ( !testContainsPrefix() ) {
+            System.out.println( "failed." );
+            failed++;
+        }
+        else {
+            succeeded++;
+        }
+        System.out.println( "OK." );
         System.out.print( "Sequence writer: " );
         if ( testSequenceWriter() ) {
             System.out.println( "OK." );
@@ -551,6 +579,15 @@ public final class Test {
             System.out.println( "failed." );
             failed++;
         }
+        System.out.print( "Phylogeny methods:" );
+        if ( Test.testPhylogenyMethods() ) {
+            System.out.println( "OK." );
+            succeeded++;
+        }
+        else {
+            System.out.println( "failed." );
+            failed++;
+        }
         System.out.print( "Postorder Iterator: " );
         if ( Test.testPostOrderIterator() ) {
             System.out.println( "OK." );
@@ -767,6 +804,15 @@ public final class Test {
             System.out.println( "failed." );
             failed++;
         }
+        System.out.print( "Clade analyis: " );
+        if ( CladeAnalysisTest.test() ) {
+            System.out.println( "OK." );
+            succeeded++;
+        }
+        else {
+            System.out.println( "failed." );
+            failed++;
+        }
         System.out.print( "Phylogeny reconstruction:" );
         System.out.println();
         if ( TestPhylogenyReconstruction.test( new File( PATH_TO_TEST_DATA ) ) ) {
@@ -1843,6 +1889,189 @@ public final class Test {
         return true;
     }
 
+    private static boolean testCommonPrefix() {
+        final List<String> l0 = new ArrayList<String>();
+        l0.add( "abc" );
+        if ( !ForesterUtil.greatestCommonPrefix( l0 ).equals( "abc" ) ) {
+            return false;
+        }
+        final List<String> l1 = new ArrayList<String>();
+        l1.add( "abc" );
+        l1.add( "abX" );
+        if ( !ForesterUtil.greatestCommonPrefix( l1 ).equals( "ab" ) ) {
+            return false;
+        }
+        final List<String> l2 = new ArrayList<String>();
+        l2.add( "abc" );
+        l2.add( "abX" );
+        l2.add( "axy" );
+        if ( !ForesterUtil.greatestCommonPrefix( l2 ).equals( "a" ) ) {
+            return false;
+        }
+        final List<String> l3 = new ArrayList<String>();
+        l3.add( "abXsdfsdfsdfsdfsdfsd" );
+        l3.add( "abXsdfsdfsdfsdfsdfsd" );
+        l3.add( "abc" );
+        l3.add( "abXsdfsdfsdfsdfsdfsd" );
+        l3.add( "ab" );
+        l3.add( "abc" );
+        l3.add( "ab" );
+        if ( !ForesterUtil.greatestCommonPrefix( l3 ).equals( "ab" ) ) {
+            return false;
+        }
+        final List<String> l4 = new ArrayList<String>();
+        l4.add( "abXsdfsdfsdfsdfsdfsd" );
+        l4.add( "abXsdfsdfsdfsdfsdfsd" );
+        l4.add( "abc" );
+        l4.add( "Xsdfsdfsdfsdfsdfsd" );
+        l4.add( "ab" );
+        l4.add( "abc" );
+        if ( !ForesterUtil.greatestCommonPrefix( l4 ).equals( "" ) ) {
+            return false;
+        }
+        final List<String> l5 = new ArrayList<String>();
+        l5.add( "" );
+        if ( !ForesterUtil.greatestCommonPrefix( l5 ).equals( "" ) ) {
+            return false;
+        }
+        final List<String> l6 = new ArrayList<String>();
+        l6.add( "abc" );
+        l6.add( "abX" );
+        l6.add( "" );
+        if ( !ForesterUtil.greatestCommonPrefix( l6 ).equals( "" ) ) {
+            return false;
+        }
+        return true;
+    }
+
+    private static boolean testCommonPrefixSep() {
+        final List<String> l0 = new ArrayList<String>();
+        l0.add( "a.b.c" );
+        if ( !ForesterUtil.greatestCommonPrefix( l0, "." ).equals( "a.b.c" ) ) {
+            return false;
+        }
+        final List<String> l1 = new ArrayList<String>();
+        l1.add( "a.b.c" );
+        l1.add( "a.b.X" );
+        if ( !ForesterUtil.greatestCommonPrefix( l1, "." ).equals( "a.b" ) ) {
+            return false;
+        }
+        final List<String> l2 = new ArrayList<String>();
+        l2.add( "a.b.c." );
+        l2.add( "a.b.X." );
+        l2.add( "a.x.y." );
+        if ( !ForesterUtil.greatestCommonPrefix( l2, "." ).equals( "a" ) ) {
+            return false;
+        }
+        final List<String> l3 = new ArrayList<String>();
+        l3.add( "a/b/X/s/d/f/s/d/f/s/d/f/s/d/f/s/d/f/s/d/" );
+        l3.add( "a/b/X/s/d/f/s/d/f/s/d/f/s/d/f/s/d/f/s/d" );
+        l3.add( "a/b/c" );
+        l3.add( "a/b/X/s/d/f/s/d/f/s/d/f/s/d/f/s/d/f/s/d/" );
+        l3.add( "a/b/" );
+        l3.add( "a/b/c/" );
+        l3.add( "a/b////////" );
+        if ( !ForesterUtil.greatestCommonPrefix( l3, "/" ).equals( "a/b" ) ) {
+            return false;
+        }
+        final List<String> l4 = new ArrayList<String>();
+        l4.add( "a.b.X.s.d.f.s.d.f.s.d.f.s.d.f.s.d.f.s.d" );
+        l4.add( "a.b.X.s.d.f.s.d.f.s.d.f.s.d.f.s.d.f.s.d" );
+        l4.add( "a.b.c" );
+        l4.add( "X.s.d.f.s.d.f.s.d.f.s.d.f.s.d.f.s.d..." );
+        l4.add( "a.b" );
+        l4.add( "a.b.c" );
+        if ( !ForesterUtil.greatestCommonPrefix( l4, "." ).equals( "" ) ) {
+            return false;
+        }
+        final List<String> l5 = new ArrayList<String>();
+        l5.add( "" );
+        if ( !ForesterUtil.greatestCommonPrefix( l5, "_" ).equals( "" ) ) {
+            return false;
+        }
+        final List<String> l6 = new ArrayList<String>();
+        l6.add( "_" );
+        l6.add( "__" );
+        if ( !ForesterUtil.greatestCommonPrefix( l6, "_" ).equals( "" ) ) {
+            return false;
+        }
+        final List<String> l7 = new ArrayList<String>();
+        l7.add( "a,b,c" );
+        l7.add( "a,b,X" );
+        l7.add( "" );
+        l7.add( ",,,,,,,,,," );
+        if ( !ForesterUtil.greatestCommonPrefix( l7, "," ).equals( "" ) ) {
+            return false;
+        }
+        final List<String> l8 = new ArrayList<String>();
+        l8.add( "123.304.403.04" );
+        l8.add( "123.304.403.04.02" );
+        l8.add( "123.304.403.03.03" );
+        if ( !ForesterUtil.greatestCommonPrefix( l8, "." ).equals( "123.304.403" ) ) {
+            return false;
+        }
+        final List<String> l9 = new ArrayList<String>();
+        l9.add( "123.304.403.04" );
+        l9.add( "123.304.403.04.02" );
+        l9.add( "123.304.402.03.03" );
+        if ( !ForesterUtil.greatestCommonPrefix( l9, "." ).equals( "123.304" ) ) {
+            return false;
+        }
+        final List<String> l10 = new ArrayList<String>();
+        l10.add( "abcde" );
+        l10.add( "adc" );
+        if ( !ForesterUtil.greatestCommonPrefix( l10, "." ).equals( "" ) ) {
+            return false;
+        }
+        return true;
+    }
+
+    private static boolean testContainsPrefix() {
+        if ( !ForesterUtil.isContainsPrefix( "a.b", "a", "." ) ) {
+            return false;
+        }
+        if ( !ForesterUtil.isContainsPrefix( "a.b.c", "a", "." ) ) {
+            return false;
+        }
+        if ( !ForesterUtil.isContainsPrefix( "a.b.c", "a.b", "." ) ) {
+            return false;
+        }
+        if ( !ForesterUtil.isContainsPrefix( "a.b", "a.b", "." ) ) {
+            return false;
+        }
+        if ( !ForesterUtil.isContainsPrefix( "a", "a", "." ) ) {
+            return false;
+        }
+        if ( !ForesterUtil.isContainsPrefix( ".a.b", ".a", "." ) ) {
+            return false;
+        }
+        if ( !ForesterUtil.isContainsPrefix( ".a.b.", ".a", "." ) ) {
+            return false;
+        }
+        if ( !ForesterUtil.isContainsPrefix( ".a.b.", ".a.", "." ) ) {
+            return false;
+        }
+        if ( !ForesterUtil.isContainsPrefix( "a..b.", "a", "." ) ) {
+            return false;
+        }
+        if ( !ForesterUtil.isContainsPrefix( "a..b.", "a..", "." ) ) {
+            return false;
+        }
+        if ( ForesterUtil.isContainsPrefix( "a", "a.b", "." ) ) {
+            return false;
+        }
+        if ( ForesterUtil.isContainsPrefix( "a_b", "a", "." ) ) {
+            return false;
+        }
+        if ( ForesterUtil.isContainsPrefix( ".a.", ".a.b.", "." ) ) {
+            return false;
+        }
+        if ( ForesterUtil.isContainsPrefix( "a.b.c", "a.x", "." ) ) {
+            return false;
+        }
+        return true;
+    }
+
     private static boolean testUTF8ParsingFromFile() {
         try {
             final PhyloXmlParser xml_parser = PhyloXmlParser.createPhyloXmlParser();
@@ -5085,7 +5314,7 @@ public final class Test {
                     .equals( "ECOLI" ) ) {
                 return false;
             }
-            if ( !ParserUtils.extractTaxonomyCodeFromNodeName( "blag_9YX45-blag", TAXONOMY_EXTRACTION.AGGRESSIVE )
+            if ( !ParserUtils.extractTaxonomyCodeFromNodeName( "blagg_9YX45-blag", TAXONOMY_EXTRACTION.AGGRESSIVE )
                     .equals( "9YX45" ) ) {
                 return false;
             }
@@ -5437,13 +5666,13 @@ public final class Test {
     private static boolean testGeneralMsaParser() {
         try {
             final String msa_str_0 = "seq1 abcd\n\nseq2 efgh\n";
-            final Msa msa_0 = GeneralMsaParser.parse( new ByteArrayInputStream( msa_str_0.getBytes() ) );
+            final Msa msa_0 = GeneralMsaParser.parseMsa( new ByteArrayInputStream( msa_str_0.getBytes() ) );
             final String msa_str_1 = "seq1 abc\nseq2 ghi\nseq1 def\nseq2 jkm\n";
-            final Msa msa_1 = GeneralMsaParser.parse( new ByteArrayInputStream( msa_str_1.getBytes() ) );
+            final Msa msa_1 = GeneralMsaParser.parseMsa( new ByteArrayInputStream( msa_str_1.getBytes() ) );
             final String msa_str_2 = "seq1 abc\nseq2 ghi\n\ndef\njkm\n";
-            final Msa msa_2 = GeneralMsaParser.parse( new ByteArrayInputStream( msa_str_2.getBytes() ) );
+            final Msa msa_2 = GeneralMsaParser.parseMsa( new ByteArrayInputStream( msa_str_2.getBytes() ) );
             final String msa_str_3 = "seq1 abc\n def\nseq2 ghi\n jkm\n";
-            final Msa msa_3 = GeneralMsaParser.parse( new ByteArrayInputStream( msa_str_3.getBytes() ) );
+            final Msa msa_3 = GeneralMsaParser.parseMsa( new ByteArrayInputStream( msa_str_3.getBytes() ) );
             if ( !msa_1.getSequenceAsString( 0 ).toString().equalsIgnoreCase( "abcdef" ) ) {
                 return false;
             }
@@ -5480,7 +5709,7 @@ public final class Test {
             if ( !msa_3.getIdentifier( 1 ).toString().equals( "seq2" ) ) {
                 return false;
             }
-            final Msa msa_4 = GeneralMsaParser.parse( new FileInputStream( PATH_TO_TEST_DATA + "msa_1.txt" ) );
+            final Msa msa_4 = GeneralMsaParser.parseMsa( new FileInputStream( PATH_TO_TEST_DATA + "msa_1.txt" ) );
             if ( !msa_4.getSequenceAsString( 0 ).toString().equalsIgnoreCase( "abcdefeeeeeeeexx" ) ) {
                 return false;
             }
@@ -5490,7 +5719,7 @@ public final class Test {
             if ( !msa_4.getSequenceAsString( 2 ).toString().equalsIgnoreCase( "klmnxphhhhhhhhzz" ) ) {
                 return false;
             }
-            final Msa msa_5 = GeneralMsaParser.parse( new FileInputStream( PATH_TO_TEST_DATA + "msa_2.txt" ) );
+            final Msa msa_5 = GeneralMsaParser.parseMsa( new FileInputStream( PATH_TO_TEST_DATA + "msa_2.txt" ) );
             if ( !msa_5.getSequenceAsString( 0 ).toString().equalsIgnoreCase( "abcdefxx" ) ) {
                 return false;
             }
@@ -5500,7 +5729,7 @@ public final class Test {
             if ( !msa_5.getSequenceAsString( 2 ).toString().equalsIgnoreCase( "klmnxpzz" ) ) {
                 return false;
             }
-            final Msa msa_6 = GeneralMsaParser.parse( new FileInputStream( PATH_TO_TEST_DATA + "msa_3.txt" ) );
+            final Msa msa_6 = GeneralMsaParser.parseMsa( new FileInputStream( PATH_TO_TEST_DATA + "msa_3.txt" ) );
             if ( !msa_6.getSequenceAsString( 0 ).toString().equalsIgnoreCase( "abcdefeeeeeeeexx" ) ) {
                 return false;
             }
@@ -12525,71 +12754,7 @@ public final class Test {
             if ( s0.match( query_nodes ) ) {
                 return false;
             }
-            /////////
-            //            query_nodes = new HashSet<PhylogenyNode>();
-            //            query_nodes.add( new PhylogenyNode( "X" ) );
-            //            query_nodes.add( new PhylogenyNode( "Y" ) );
-            //            query_nodes.add( new PhylogenyNode( "A" ) );
-            //            query_nodes.add( new PhylogenyNode( "B" ) );
-            //            query_nodes.add( new PhylogenyNode( "C" ) );
-            //            query_nodes.add( new PhylogenyNode( "D" ) );
-            //            query_nodes.add( new PhylogenyNode( "E" ) );
-            //            query_nodes.add( new PhylogenyNode( "F" ) );
-            //            query_nodes.add( new PhylogenyNode( "G" ) );
-            //            if ( !s0.match( query_nodes ) ) {
-            //                return false;
-            //            }
-            //            query_nodes = new HashSet<PhylogenyNode>();
-            //            query_nodes.add( new PhylogenyNode( "X" ) );
-            //            query_nodes.add( new PhylogenyNode( "Y" ) );
-            //            query_nodes.add( new PhylogenyNode( "A" ) );
-            //            query_nodes.add( new PhylogenyNode( "B" ) );
-            //            query_nodes.add( new PhylogenyNode( "C" ) );
-            //            if ( !s0.match( query_nodes ) ) {
-            //                return false;
-            //            }
-            //            //
-            //            query_nodes = new HashSet<PhylogenyNode>();
-            //            query_nodes.add( new PhylogenyNode( "X" ) );
-            //            query_nodes.add( new PhylogenyNode( "Y" ) );
-            //            query_nodes.add( new PhylogenyNode( "D" ) );
-            //            query_nodes.add( new PhylogenyNode( "E" ) );
-            //            query_nodes.add( new PhylogenyNode( "F" ) );
-            //            query_nodes.add( new PhylogenyNode( "G" ) );
-            //            if ( !s0.match( query_nodes ) ) {
-            //                return false;
-            //            }
-            //            //
-            //            query_nodes = new HashSet<PhylogenyNode>();
-            //            query_nodes.add( new PhylogenyNode( "X" ) );
-            //            query_nodes.add( new PhylogenyNode( "Y" ) );
-            //            query_nodes.add( new PhylogenyNode( "A" ) );
-            //            query_nodes.add( new PhylogenyNode( "B" ) );
-            //            query_nodes.add( new PhylogenyNode( "C" ) );
-            //            query_nodes.add( new PhylogenyNode( "D" ) );
-            //            if ( !s0.match( query_nodes ) ) {
-            //                return false;
-            //            }
-            //            //
-            //            query_nodes = new HashSet<PhylogenyNode>();
-            //            query_nodes.add( new PhylogenyNode( "X" ) );
-            //            query_nodes.add( new PhylogenyNode( "Y" ) );
-            //            query_nodes.add( new PhylogenyNode( "E" ) );
-            //            query_nodes.add( new PhylogenyNode( "F" ) );
-            //            query_nodes.add( new PhylogenyNode( "G" ) );
-            //            if ( !s0.match( query_nodes ) ) {
-            //                return false;
-            //            }
-            //            //
-            //            query_nodes = new HashSet<PhylogenyNode>();
-            //            query_nodes.add( new PhylogenyNode( "X" ) );
-            //            query_nodes.add( new PhylogenyNode( "Y" ) );
-            //            query_nodes.add( new PhylogenyNode( "F" ) );
-            //            query_nodes.add( new PhylogenyNode( "G" ) );
-            //            if ( !s0.match( query_nodes ) ) {
-            //                return false;
-            //            }
-            //
+           
             query_nodes = new HashSet<PhylogenyNode>();
             query_nodes.add( PhylogenyNode.createInstanceFromNhxString( "X" ) );
             query_nodes.add( PhylogenyNode.createInstanceFromNhxString( "Y" ) );
@@ -12607,8 +12772,7 @@ public final class Test {
             if ( s0.match( query_nodes ) ) {
                 return false;
             }
-            ///////////////////////////
-            //
+      
             query_nodes = new HashSet<PhylogenyNode>();
             query_nodes.add( PhylogenyNode.createInstanceFromNhxString( "X" ) );
             query_nodes.add( PhylogenyNode.createInstanceFromNhxString( "Y" ) );
@@ -12791,7 +12955,6 @@ public final class Test {
             if ( !s0.match( query_nodes ) ) {
                 return false;
             }
-            //
             query_nodes = new HashSet<PhylogenyNode>();
             query_nodes.add( PhylogenyNode.createInstanceFromNhxString( "F" ) );
             query_nodes.add( PhylogenyNode.createInstanceFromNhxString( "G" ) );
@@ -12799,7 +12962,6 @@ public final class Test {
             if ( !s0.match( query_nodes ) ) {
                 return false;
             }
-            //
             query_nodes = new HashSet<PhylogenyNode>();
             query_nodes.add( PhylogenyNode.createInstanceFromNhxString( "F" ) );
             query_nodes.add( PhylogenyNode.createInstanceFromNhxString( "G" ) );
@@ -13192,7 +13354,7 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n3 = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG_12345", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
+                    .createInstanceFromNhxString( "BLAGG_12345", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
             if ( !n3.getNodeData().getTaxonomy().getIdentifier().getValue().equals( "12345" ) ) {
                 System.out.println( n3.toString() );
                 return false;
@@ -13210,62 +13372,80 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n6 = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG-12345-blag", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
+                    .createInstanceFromNhxString( "BLAGG-12345-blag",
+                                                  NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
             if ( n6.getNodeData().isHasTaxonomy() ) {
                 System.out.println( n6.toString() );
                 return false;
             }
             final PhylogenyNode n7 = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG-12345_blag", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
+                    .createInstanceFromNhxString( "BL-12345_blag", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
             if ( n7.getNodeData().isHasTaxonomy() ) {
                 System.out.println( n7.toString() );
                 return false;
             }
             final PhylogenyNode n8 = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG_12345-blag", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
+                    .createInstanceFromNhxString( "BLAGG_12345-blag",
+                                                  NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
             if ( !n8.getNodeData().getTaxonomy().getIdentifier().getValue().equals( "12345" ) ) {
                 System.out.println( n8.toString() );
                 return false;
             }
             final PhylogenyNode n9 = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG_12345/blag", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
+                    .createInstanceFromNhxString( "BLAGG_12345/blag",
+                                                  NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
             if ( !n9.getNodeData().getTaxonomy().getIdentifier().getValue().equals( "12345" ) ) {
                 System.out.println( n9.toString() );
                 return false;
             }
             final PhylogenyNode n10x = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG_12X45-blag", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
+                    .createInstanceFromNhxString( "BLAG!_12X45-blag",
+                                                  NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
             if ( n10x.getNodeData().isHasTaxonomy() ) {
                 System.out.println( n10x.toString() );
                 return false;
             }
             final PhylogenyNode n10xx = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG_1YX45-blag", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
+                    .createInstanceFromNhxString( "BLAG!_1YX45-blag",
+                                                  NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
             if ( n10xx.getNodeData().isHasTaxonomy() ) {
                 System.out.println( n10xx.toString() );
                 return false;
             }
             final PhylogenyNode n10 = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG_9YX45-blag", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
+                    .createInstanceFromNhxString( "BLAGG_9YX45-blag",
+                                                  NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
             if ( !n10.getNodeData().getTaxonomy().getTaxonomyCode().equals( "9YX45" ) ) {
                 System.out.println( n10.toString() );
                 return false;
             }
+            final PhylogenyNode n10v = PhylogenyNode
+                    .createInstanceFromNhxString( "BLAGG_BPM1-blag", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
+            if ( !n10v.getNodeData().getTaxonomy().getTaxonomyCode().equals( "BPM1" ) ) {
+                System.out.println( n10v.toString() );
+                return false;
+            }
+            final PhylogenyNode n10v2 = PhylogenyNode
+                    .createInstanceFromNhxString( "BLAGG_ABV-blag", NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
+            if ( !n10v2.getNodeData().getTaxonomy().getTaxonomyCode().equals( "ABV" ) ) {
+                System.out.println( n10v2.toString() );
+                return false;
+            }
             final PhylogenyNode n11 = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG_Mus_musculus", NHXParser.TAXONOMY_EXTRACTION.AGGRESSIVE );
+                    .createInstanceFromNhxString( "BLAG@_Mus_musculus", NHXParser.TAXONOMY_EXTRACTION.AGGRESSIVE );
             if ( !n11.getNodeData().getTaxonomy().getScientificName().equals( "Mus musculus" ) ) {
                 System.out.println( n11.toString() );
                 return false;
             }
             final PhylogenyNode n12 = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG_Mus_musculus_musculus",
+                    .createInstanceFromNhxString( "BLA_G_Mus_musculus_musculus",
                                                   NHXParser.TAXONOMY_EXTRACTION.AGGRESSIVE );
             if ( !n12.getNodeData().getTaxonomy().getScientificName().equals( "Mus musculus musculus" ) ) {
                 System.out.println( n12.toString() );
                 return false;
             }
             final PhylogenyNode n13 = PhylogenyNode
-                    .createInstanceFromNhxString( "BLAG_Mus_musculus1", NHXParser.TAXONOMY_EXTRACTION.AGGRESSIVE );
+                    .createInstanceFromNhxString( "BLAaG_Mus_musculus1", NHXParser.TAXONOMY_EXTRACTION.AGGRESSIVE );
             if ( n13.getNodeData().isHasTaxonomy() ) {
                 System.out.println( n13.toString() );
                 return false;
@@ -13427,6 +13607,74 @@ public final class Test {
         return true;
     }
 
+    private static boolean testPhylogenyMethods() {
+        try {
+            final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+            final Phylogeny t0 = factory.create( "((((A,B)ab,C)abc,D)abcd,E)r", new NHXParser() )[ 0 ];
+            if ( PhylogenyMethods.calculateLevel( t0.getNode( "A" ) ) != 0 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t0.getNode( "B" ) ) != 0 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t0.getNode( "ab" ) ) != 1 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t0.getNode( "C" ) ) != 0 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t0.getNode( "abc" ) ) != 2 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t0.getNode( "D" ) ) != 0 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t0.getNode( "abcd" ) ) != 3 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t0.getNode( "E" ) ) != 0 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t0.getNode( "r" ) ) != 4 ) {
+                return false;
+            }
+            final Phylogeny t1 = factory.create( "((((A,B)ab,C)abc,D)abcd,E,((((((X)1)2)3)4)5)6)r",
+                                                 new NHXParser() )[ 0 ];
+            if ( PhylogenyMethods.calculateLevel( t1.getNode( "r" ) ) != 7 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t1.getNode( "X" ) ) != 0 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t1.getNode( "6" ) ) != 6 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t1.getNode( "5" ) ) != 5 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t1.getNode( "4" ) ) != 4 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t1.getNode( "3" ) ) != 3 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t1.getNode( "2" ) ) != 2 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t1.getNode( "1" ) ) != 1 ) {
+                return false;
+            }
+            if ( PhylogenyMethods.calculateLevel( t1.getNode( "abcd" ) ) != 3 ) {
+                return false;
+            }
+        }
+        catch ( final Exception e ) {
+            e.printStackTrace( System.out );
+            return false;
+        }
+        return true;
+    }
+
     private static boolean testUniprotEntryRetrieval() {
         try {
             final SequenceDatabaseEntry entry = SequenceDbWsTools.obtainUniProtEntry( "P12345", 5000 );