The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

package Local::SQL::Translator::Parser::XML::Xmldoom;
use base qw(Test::Class);

use SQL::Translator;
use SQL::Translator::Schema::Constants;
use SQL::Translator::Parser::XML::Xmldoom;
use Test::More;
use strict;

use Data::Dumper;

sub parse
{
	my $translator = SQL::Translator->new(@_);

	SQL::Translator::Parser::XML::Xmldoom::parse($translator, ${$translator->data});

	return $translator->schema;
}

sub testDatabaseTag : Test(2)
{
	my $self = shift;

	my $xml = << "EOF";
<?xml version="1.0"?>
<database
	name="bookstore"
	defaultIdMethod="native"
	defaultJavaType="primitive"
	package="package"
	baseClass="com.myapp.om.BaseClass"
	basePeer="com.myapp.om.BasePeer"
	defaultJavaNamingMethod="underscore"
	heavyIndexing="false">
</database>
EOF

	my $schema = parse(data => $xml);

	is( $schema->name, 'bookstore' );
	is( $schema->extra('defaultIdMethod'), 'native');
}

sub testTableTag : Test(2)
{
	my $self = shift;

	my $xml = << "EOF";
<?xml version="1.0"?>
<database>
	<table name="book" description="Book Table">
	</table>
</database>
EOF

	my $schema = parse(data => $xml);
	my $table  = $schema->get_table('book');

	is( $table->name, 'book' );
	is( $table->extra('description'), 'Book Table');
}

sub testColumnTag : Test(20)
{
	my $self = shift;

	my $xml = << "EOF";
<?xml version="1.0"?>
<database
xmlns="http://gna.org/projects/xmldoom/database"
xmlns:perl="http://gna.org/projects/xmldoom/database-perl">
	<table name="book">
		<column
			name="book_id"
			primaryKey="true"
			type="INTEGER"
			description="Book Id"
			auto_increment="true"
			perl:idGenerator="Some::Perl::Class"
		/>
		<column
			name="title"
			required="true"
			type="VARCHAR"
			size="255"
			default="Unknown"
			description="Book Title"
		/>
		<column
			name="active"
			type="ENUM">
				<options>
					<option>Y</option>
					<option>N</option>
				</options>
		</column>
		<column
			name="last_changed"
			type="DATETIME"
			timestamp="current"
		/>
	</table>
</database>
EOF

	my $schema = parse(data => $xml);
	my $table  = $schema->get_table('book');
	my $field1 = $table->get_field('book_id');
	my $field2 = $table->get_field('title');
	my $field3 = $table->get_field('active');
	my $field4 = $table->get_field('last_changed');

	# check first field
	is( $field1->name,                  'book_id' );
	is( $field1->data_type,             'INTEGER' );
	is( $field1->is_primary_key,        1 );
	is( $field1->is_nullable,           1 );
	is( $field1->is_auto_increment,     1 );
	is( $field1->extra('description'), 'Book Id' );
	is( $field1->extra('idGenerator'), 'Some::Perl::Class' );

	# check second field
	is( $field2->name,                  'title' );
	is( $field2->data_type,             'VARCHAR' );
	is( $field2->is_primary_key,        0 );
	is( $field2->is_nullable,           0 );
	is( $field2->is_auto_increment,     0 );
	is( $field2->extra('description'), 'Book Title' );
	is( $field2->default_value,        'Unknown' );

	# check enum field
	my $options = $field3->extra( 'list' );
	is( scalar @$options, 2 );
	is( $options->[0], 'Y' );
	is( $options->[1], 'N' );

	# check the timestamp attribute
	is( $field4->extra('timestamp'), 'current' );

	my @primary_key;
	foreach my $constraint ( $table->get_constraints )
	{
		if ( $constraint->type eq PRIMARY_KEY )
		{
			@primary_key = $constraint->field_names;
			last;
		}
	}

	ok( scalar @primary_key == 1 );
	is( $primary_key[0], 'book_id' );
}

sub testForeignKeyTag : Test(6)
{
	my $self = shift;

	my $xml = << "EOF";
<?xml version="1.0"?>
<database>
	<table name="book">
		<column
			name="book_id"
			type="INTEGER"
			primaryKey="true"
			auto_increment="true"
		/>
		<column
			name="author_id"
			type="INTEGER"
			required="true"
		/>
		<column
			name="title"
			required="true"
			type="VARCHAR"
			size="255"
			default="Unknown"
		/>

		<foreign-key foreignTable="author">
			<reference
				local="author_id"
				foreign="author_id"
			/>
		</foreign-key>
	</table>
	<table name="author">
		<column
			name="author_id"
			type="INTEGER"
			primaryKey="true"
			auto_increment="true"
		/>
	</table>
</database>
EOF

	my $schema = parse(data => $xml);
	my $table  = $schema->get_table('book');
	
	my @foreign_keys;
	foreach my $constraint ( $table->get_constraints )
	{
		if ( $constraint->type eq FOREIGN_KEY )
		{
			push @foreign_keys, $constraint;
		}
	}

	ok( scalar @foreign_keys == 1 );
	is( $foreign_keys[0]->reference_table, 'author' );
	
	my @local_fields   = $foreign_keys[0]->fields;
	my @foreign_fields = $foreign_keys[0]->reference_fields;

	ok( scalar @local_fields == 1 );
	is( $local_fields[0], 'author_id' );
	ok( scalar @foreign_fields == 1 );
	is( $foreign_fields[0], 'author_id' );
}

1;