The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
use strict;
use Test;
use t::Config;

BEGIN { plan tests => scalar(@t::Config::drivers) * 12 }

require 't/util.pl';
use DbFramework::Persistent;
use DbFramework::DataModel;
use DbFramework::Table;
use DbFramework::Util;

package Foo;
use base qw(DbFramework::Persistent);

package main;

for ( @t::Config::drivers ) { foo($_) }

sub foo($) {
  my($driver) = @_;

  my($catalog_db,$c_dsn,$c_u,$c_p) = connect_args($driver,'catalog');
  my($test_db,$dsn,$u,$p) = connect_args($driver,'test');

  my $dm  = new DbFramework::DataModel($test_db,$dsn,$u,$p);
  $dm->init_db_metadata($c_dsn,$c_u,$c_p);
  my $dbh     = $dm->dbh; $dbh->{PrintError} = 0;
  my $catalog = new DbFramework::Catalog($c_dsn);
  my $foo     = new Foo($dm->collects_table_h_byname('foo'),$dbh,$catalog);
  ok(1);

  # init
  $foo->table->delete;
  ok(1);

  # insert
  $foo->attributes_h(['foo',0,'bar','bar','baz','baz','quux',0]);
  my $pk = ($driver =~ /(mSQL|Pg)/ ) ? -1 : 1;
  ok($foo->insert,$pk);
  my %foo = ( foo => 0, bar => 'baz', baz => 'baz', quux => 1 );
  $foo->attributes_h([ %foo ]);
  $pk = ($driver =~ /(mSQL|Pg)/ ) ? -1 : 2;
  ok($foo->insert,$pk);
  my @foo = $foo->attributes_h_byname('foo','bar');
  ok($foo[1],$foo{bar});

  # update
  $pk = ($driver =~ /(mSQL|Pg)/ ) ? 0 : 2;
  $foo->attributes_h(['foo',$pk,'bar','baz','baz','quux']);
  my $rows = ($driver =~ /mSQL/ ) ? -1 : 1;
  ok($foo->update,$rows);

  # select
  $foo->attributes_h([]);
  @foo = $foo->select(undef,'bar');
  my @a = $foo[0]->attributes_h_byname('foo','bar');
  $pk = ($driver =~ /(mSQL|Pg)/ ) ? 0 : 1;
  ok("@a","$pk bar");
  @a  = $foo[1]->attributes_h_byname('foo','bar');
  $pk = ($driver =~ /(mSQL|Pg)/ ) ? 0 : 2;
  ok("@a","$pk baz");
  @foo = $foo->select(q{bar like 'b%'},'foo,bar');
  ok(@foo,2);

  # delete
  $rows = ($driver =~ /mSQL/ ) ? -1 : 1;
  ok($foo[0]->delete,$rows);

  # make persistent (sub)class
  my($class,$table) = ('Bar','bar');
  my $ok = qq{package $class;
use strict;
use base qw(DbFramework::Persistent);
};
  ok(DbFramework::Persistent->make_class($class),$ok);
  eval $ok;
  my $bar = $class->new($dm->collects_table_h_byname($table),$dbh,$catalog);
  ok($bar->table->name,$table);
}