The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# 02_use.t

use strict;
use File::Spec;
use Test::More;

#####
# prereqs 

for ( "DBI", "DBD::SQLite" ) {
    eval "require $_";
    if ( $@ ) {
        plan(skip_all=>"$_ is NOT available");
        exit(0);
    }
}

#####
# table setup

my %dsn = (
    DataSource  => "dbi:SQLite:dbname=" . File::Spec->catfile('t', 'counter.sqlt'),
    TableName   => 'counters'
);

my $dbh = DBI->connect($dsn{DataSource}, '', '', {RaiseError=>0, PrintError=>0});
unless ( $dbh ) {
    plan(skip_all=>"Couldn't establish connection with the server");
    exit(0);
}

my ($count) = $dbh->selectrow_array("SELECT COUNT(*) FROM $dsn{TableName}");
unless ( defined $count ) {
    unless( $dbh->do(qq|
        CREATE TABLE $dsn{TableName} (
            counter_id CHAR(64) NOT NULL PRIMARY KEY,
            value INT NOT NULL
        )|) ) {
        plan(skip_all=>$dbh->errstr);
        exit(0);
    }
}

#####
# tests start here

plan tests => 11;

use DBIx::Counter;

my $c = DBIx::Counter->new('test', dsn => $dsn{DataSource}, login=>'aap' );

isa_ok( $c, 'DBIx::Counter');

is($c->value, 0, "c is a new counter at 0");

$c->inc;

is($c->value, 1, "inc works: c == 1");

$c--;

is($c->value, 0, "-- works");

$c++;

is($c->value, 1, "++ works");
is("$c", "1", "stringification works");

my $d;
eval {
$d = DBIx::Counter->new('test2');
};

like($@, qr/Unable to connect to database/, "croaks OK without proper arguments");

$d = DBIx::Counter->new('test', dbh => $dbh);
is($d->value, 1, "Using a predefined dbh works");
$d++;
is($c->value, 2, "multiple counters work");

local $DBIx::Counter::DSN   = $dsn{DataSource};
local $DBIx::Counter::LOGIN = '';

$d = DBIx::Counter->new('test2', 4);

isa_ok( $d, 'DBIx::Counter', "package variable settings work: d");
is($d->value, 4, "d == 4: initial works");

$c->_db->do(qq{delete from $dsn{TableName}});

# to avoid warnings
local $DBIx::Counter::DSN   = $dsn{DataSource};
local $DBIx::Counter::LOGIN = '';