The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#-*-perl-*-
# $Id$

use strict;
use Bio::Root::Test;
test_begin( -tests=>46,
	    -requires_modules => [qw(Bio::Phylo)]);

use_ok( 'Bio::Tree::Tree' );
use_ok( 'Bio::TreeIO' );
use_ok('Bio::TreeIO::nexml'); # checks that your module is there and loads ok

diag("WARNING: NeXML parsing for NeXML v0.9 is currently very experimental support");
#Read in Data
ok( my $TreeStream = Bio::TreeIO->new(-file => test_input_file('nexml','trees.nexml.xml'), -format => 'nexml') );

	#checking first tree object
	ok( my $tree_obj = $TreeStream->next_tree(), 'tree obj read' );
	isa_ok($tree_obj, 'Bio::Tree::Tree');
	is( $tree_obj->get_root_node()->id(), 'n1', "root node");
	my @nodes = $tree_obj->get_nodes();
	is( @nodes, 9, "number of nodes");
	ok ( my $node7 = $tree_obj->find_node('n7') );
	is( $node7->branch_length, 0.3247, "branch length");
	is( $node7->ancestor->id, 'n3', 'anc id');
	is( $node7->ancestor->branch_length, '0.34534', 'anc bl');
	#Check leaf nodes and taxa
	my %expected_leaves = (
							'n8'	=>	'bird',
							'n9'	=>	'worm',
							'n5'	=>	'dog',
							'n6'	=>	'mouse',
							'n2'	=>	'human'
	);
	ok( my @leaves = $tree_obj->get_leaf_nodes() );
	is( @leaves, 5, "number of leaf nodes");
	foreach my $leaf (@leaves) {
		my $leafID = $leaf->id();
		ok( exists $expected_leaves{$leaf->id()}, "$leafID exists"  );
		is( $leaf->get_tag_values('taxon'), $expected_leaves{$leaf->id()}, "$leafID taxon");
	}
	
	
#Write data
diag('Begin tests for writing tree files');
my $outdata = test_output_file();
ok( my $outTreeStream = Bio::TreeIO->new(-file => ">$outdata", -format => 'nexml'), 'out stream');
ok( $outTreeStream->write_tree($tree_obj), 'write tree');
close($outdata);

#Read in the out file to test roundtrip
my $inTreeStream = Bio::TreeIO->new(-file => $outdata, -format => 'nexml');
	
	#checking first tree object
	ok($tree_obj = $inTreeStream->next_tree(), 'read tree obj (rt)' );
	isa_ok($tree_obj, 'Bio::Tree::Tree');
	is( $tree_obj->get_root_node()->id(), 'n1', "root node (rt)");
	my @outnodes = $tree_obj->get_nodes();
	is( @outnodes, 9, "number of nodes (rt)");
	ok ( $node7 = $tree_obj->find_node('n7') );
	is( $node7->branch_length, 0.3247, "branch length (rt)");
	is( $node7->ancestor->id, 'n3','anc id (rt)');
	is( $node7->ancestor->branch_length, '0.34534', 'anc bl (rt)');
	
	#Check leaf nodes and taxa
	ok( my @outleaves = $tree_obj->get_leaf_nodes() );
	is( @outleaves, 5, "number of leaf nodes (rt)");
	foreach my $leaf (@outleaves)
	{
		my $leafID = $leaf->id();
		ok( exists $expected_leaves{$leaf->id()}, "$leafID exists (rt)"  );
		is( $leaf->get_tag_values('taxon'), $expected_leaves{$leaf->id()}, "$leafID taxon (rt)");
	}