The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;

use Test::More tests => 38;

BEGIN {
    use_ok('DBI');
}

my $dbh = DBI->connect( 'dbi:Mock:', '', '' );
isa_ok($dbh, 'DBI::db');

$dbh->{PrintError} = 0;

################################################################################

$dbh->{AutoCommit} = 0;
ok( $dbh->{AutoCommit} == 0, "AutoCommit is off" );

ok( $dbh->commit, 'commit() returns true' );
ok( $dbh->rollback, 'rollback() returns true' );

ok( !defined $dbh->begin_work, "begin_work() fails if AutoCommit is off" );
is( $DBI::errstr, 'AutoCommit is off, you are already within a transaction');

my $history = $dbh->{mock_all_history};
ok( @$history == 2, "Correct number of statements" );

is( $history->[0]->statement, 'COMMIT' );
ok( @{$history->[0]->bound_params} == 0, 'No parameters' );

is( $history->[1]->statement, 'ROLLBACK' );
ok( @{$history->[1]->bound_params} == 0, 'No parameters' );

ok( $dbh->{AutoCommit} == 0, "AutoCommit is still off" );

$dbh->{mock_clear_history} = 1;

################################################################################

$dbh->{AutoCommit} = 1;
ok( $dbh->{AutoCommit} == 1, "AutoCommit is on" );

ok( !defined $dbh->commit, "Commit returns false" );
is( $DBI::errstr, "commit ineffective with AutoCommit" );
ok( !defined $dbh->rollback, "Rollback returns false" );
is( $DBI::errstr, "rollback ineffective with AutoCommit" );

ok( $dbh->{AutoCommit} == 1, "AutoCommit is still on" );

$history = $dbh->{mock_all_history};
ok( @$history == 0, "Correct number of statements" );

$dbh->{mock_clear_history} = 1;

################################################################################

$dbh->{AutoCommit} = 1;
ok( $dbh->{AutoCommit} == 1, "AutoCommit is on" );

ok( $dbh->begin_work, 'begin_work() returns true' );
ok( $dbh->{AutoCommit} == 0, "AutoCommit is now off" );

ok( $dbh->rollback, 'rollback() returns true' );
ok( $dbh->{AutoCommit} == 1, "AutoCommit is back on" );

ok( $dbh->begin_work, 'begin_work() returns true' );
ok( $dbh->{AutoCommit} == 0, "AutoCommit is now off" );

ok( $dbh->commit, 'rollback() returns true' );
ok( $dbh->{AutoCommit} == 1, "AutoCommit is back on" );

$history = $dbh->{mock_all_history};
ok( @$history == 4, "Correct number of statements" );

is( $history->[0]->statement, 'BEGIN WORK' );
ok( @{$history->[0]->bound_params} == 0, 'No parameters' );

is( $history->[1]->statement, 'ROLLBACK' );
ok( @{$history->[1]->bound_params} == 0, 'No parameters' );

is( $history->[2]->statement, 'BEGIN WORK' );
ok( @{$history->[2]->bound_params} == 0, 'No parameters' );

is( $history->[3]->statement, 'COMMIT' );
ok( @{$history->[3]->bound_params} == 0, 'No parameters' );