Author: REHSACK
Date: Mon May 24 05:08:04 2010
New Revision: 14024

Modified:
   dbi/trunk/t/50dbm_simple.t

Log:
prove $sth->rows after DELETE and UPDATE statements

Modified: dbi/trunk/t/50dbm_simple.t
==============================================================================
--- dbi/trunk/t/50dbm_simple.t  (original)
+++ dbi/trunk/t/50dbm_simple.t  Mon May 24 05:08:04 2010
@@ -54,6 +54,23 @@
             }
         }
     }
+
+    if( eval { require List::MoreUtils; } )
+    {
+       List::MoreUtils->import("part");
+    }
+    else
+    {
+       # XXX from PP part of List::MoreUtils
+       eval <<'EOP';
+sub part(&@) {
+    my ($code, @list) = @_;
+    my @parts;
+    push @{ $parts[$code->($_)] }, $_  for @list;
+    return @parts;
+}
+EOP
+    }
 }
 
 my $dir = File::Spec->catdir(getcwd(),'test_output');
@@ -61,7 +78,7 @@
 rmtree $dir;
 mkpath $dir;
 
-my %expected_results = (
+my %tests_statement_results = (
     2 => [
        "DROP TABLE IF EXISTS fruit", -1,
        "CREATE TABLE fruit (dKey INT, dVal VARCHAR(10))", '0E0',
@@ -111,15 +128,29 @@
 print "Using DBM modules: @dbm_types\n";
 print "Using MLDBM serializers: @mldbm_types\n" if @mldbm_types;
 
+my %test_statements;
+my %expected_results;
+
+for my $columns ( 2 .. 3 )
+{
+    my $i = 0;
+    my @tests = part { $i++ % 2 } @{ $tests_statement_results{$columns} };
+    @{ $test_statements{$columns} } = @{$tests[0]};
+    @{ $expected_results{$columns} } = @{$tests[1]};
+}
+
 my $tests_offsets_group = 5;
 my $ndbm_types = scalar @dbm_types;
 my $nmldbm_types = scalar @mldbm_types;
-my $tests_without_mldbm = $tests_offsets_group + 
scalar(@{$expected_results{2}}) / 2 + 1;
-my $tests_with_mldbm = ( $nmldbm_types - 1 ) * ($tests_offsets_group + 
scalar(@{$expected_results{3}})/2 + 1);
+my $tests_without_mldbm = $tests_offsets_group + 
scalar(@{$test_statements{2}});
+   $tests_without_mldbm += grep { m/^(?:SELECT|UPDATE|DELETE)/ } @{ 
$test_statements{2} };
+my $tests_with_mldbm = $tests_offsets_group + scalar(@{$test_statements{3}});
+   $tests_with_mldbm += grep { m/^(?:SELECT|UPDATE|DELETE)/ } @{ 
$test_statements{3} };
+   $tests_with_mldbm *= $nmldbm_types - 1;
 my $num_tests = $ndbm_types * ( $tests_without_mldbm + $tests_with_mldbm );
 printf "Test count: %d x ( ( %d + %d ) + %d x ( %d + %d ) ) = %d\n",
-    scalar $ndbm_types, $tests_offsets_group, scalar(@{$expected_results{2}}) 
/ 2 + 1,
-                        $nmldbm_types - 1, $tests_offsets_group, 
scalar(@{$expected_results{3}})/2 + 1,
+    $ndbm_types, $tests_offsets_group, $tests_without_mldbm - 
$tests_offsets_group,
+                 $nmldbm_types - 1, $tests_offsets_group, $tests_with_mldbm / 
($nmldbm_types - 1) - $tests_offsets_group,
     $num_tests;
     
 if (!$num_tests) {
@@ -130,25 +161,17 @@
 }
 
 for my $mldbm ( @mldbm_types ) {
-    my @sql = ($mldbm) ? @{$expected_results{3}} : @{$expected_results{2}};
+    my $columns = ($mldbm) ? 3 : 2;
     for my $dbm_type ( @dbm_types ) {
        print "\n--- Using $dbm_type ($mldbm) ---\n";
-        eval { do_test( $dbm_type, $mldbm, @sql) }
+        eval { do_test( $dbm_type, $mldbm, $columns) }
             or warn $@;
     }
 }
 rmtree $dir;
 
-# XXX from PP part of List::MoreUtils
-sub part(&@) {
-    my ($code, @list) = @_;
-    my @parts;
-    push @{ $parts[$code->($_)] }, $_  for @list;
-    return @parts;
-}
-
 sub do_test {
-    my ($dtype, $mldbm, @sqltests) = @_;
+    my ($dtype, $mldbm, $columns) = @_;
 
     my $test_builder = Test::More->builder;
     my $starting_test_no = $test_builder->current_test;
@@ -200,11 +223,8 @@
     };
     ok($@);
 
-    # XXX I would prefer use List::Moreutils::part ...
-    my $i = 0;
-    my @tests = part { $i++ % 2 } @sqltests;
-    my @queries = @{$tests[0]};
-    my @results = @{dclone $tests[1]};
+    my @queries = @{$test_statements{$columns}};
+    my @results = @{$expected_results{$columns}};
 
     SKIP:
     for my $idx ( 0 .. $#queries ) {
@@ -230,19 +250,20 @@
         my $n = $sth->execute(@bind);
         if ($sth->err and $sql !~ /^DROP/ ) {
             skip "execute failed: " . $sth->errstr || 'unknown error',
-               ($sql =~ /SELECT/) ? 2 : 1;
+               ($sql =~ /^(?:SELECT|UPDATE|DELETE)/) ? 2 : 1;
         }
        is( $n, $results[$idx], $sql ) unless( 'ARRAY' eq ref $results[$idx] );
+       TODO: {
+           local $TODO = "AUTOPROXY drivers might throw away sth->rows()";
+           is( $n, $sth->rows, '$sth->execute(' . $sql . ') == $sth->rows' ) 
if( $sql =~ m/^(?:UPDATE|DELETE)/ );
+       }
         next unless $sql =~ /SELECT/;
         my $results='';
         # Note that we can't rely on the order here, it's not portable,
         # different DBMs (or versions) will return different orders.
        my $allrows = $sth->fetchall_arrayref();
        my $expected_rows = $results[$idx];
-       TODO: {
-           local $TODO = "Proxying DBD's might not return amount of fetched 
rows";
-           is( $sth->rows, scalar( @{$expected_rows} ), $sql );
-       }
+       is( $sth->rows, scalar( @{$expected_rows} ), $sql );
        is_deeply( $allrows, $expected_rows, 'SELECT results' );
     }
     $dbh->disconnect;

Reply via email to