/lib/perl/Blerg-Database/t/database.t
# Before 'make install' is performed this script should be runnable with
# 'make test'. After 'make install' it should work as 'perl Blerg-Database.t'

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

# change 'tests => 1' to 'tests => last_test_to_print';

use File::Path qw/remove_tree/;
use strict;
use warnings;

use Test::More tests => 30;
BEGIN { use_ok('Blerg::Database') };

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

# Insert your test code below, the Test::More module is use()ed here so read
# its man page ( perldoc Test::More ) for help writing this test script.

# Setup
my $test_user = 'barfy';
my $test_dir = "/tmp/blerg_test_$$";
mkdir $test_dir;
chdir $test_dir;
mkdir 'data';
mkdir 'hash_tags';
mkdir 'ref_tags';

$ENV{BLERG_PATH} = $test_dir;
ok( Blerg::Database::init() );

my ($ptr, @list, $n);
$n = 0;

### C interface

# Open a database
$ptr = Blerg::Database::_open($test_user);
ok( ref $ptr eq 'struct blergPtr' );

# Store
my $data = "Hello!";
my $t0 = time;
ok( Blerg::Database::_store($ptr, $data) == $n );

# Check internal database
open DATA, "data/$test_user/data0";
my $check_data = <DATA>;
close DATA;
ok( $check_data eq $data );

# Fetch
ok( Blerg::Database::_fetch($ptr, $n) eq $data );
ok( not defined Blerg::Database::_fetch($ptr, $n + 1) );

# Get time
my $t = Blerg::Database::_get_timestamp($ptr, $n);
ok( $t0 - $t <= 1.0 );

# Test tags
Blerg::Database::_store($ptr, "This is data A #data");
Blerg::Database::_store($ptr, "This is data B #data");
Blerg::Database::_store($ptr, "This is data C #data");
$n += 3;

@list = Blerg::Database::tag_list('#data', 0, 1);
ok( @list == 3 );
ok( $list[0]->{author} eq $test_user );
ok( $list[0]->{record} == $n );

# Test status
ok( Blerg::Database::_set_status($ptr, Blerg::Database::BLERGSTATUS_MUTED, 1) );
ok( Blerg::Database::_get_status($ptr, Blerg::Database::BLERGSTATUS_MUTED) == 1 );
Blerg::Database::_store($ptr, "Testing more #data");
@list = Blerg::Database::tag_list('#data', 0, 1);
ok( @list == 3 );
ok( Blerg::Database::_set_status($ptr, Blerg::Database::BLERGSTATUS_MUTED, 0) );
ok( Blerg::Database::_get_status($ptr, Blerg::Database::BLERGSTATUS_MUTED) == 0 );
Blerg::Database::_store($ptr, "Testing more #data");
@list = Blerg::Database::tag_list('#data', 0, 1);
ok( @list == 4 );
$n += 2;

# Count
my $count = Blerg::Database::_get_record_count($ptr);
ok( $count == $n + 1 );

# Close database
ok( Blerg::Database::_close($ptr) );

# Test existence
ok( Blerg::Database::exists($test_user) );


### Perl OO interface

# Open a nonexistent database
my $blerg = Blerg::Database->open_existing('nonexistent');
ok( not defined $blerg );

# Open a database
$blerg = Blerg::Database->open($test_user);
ok( defined $blerg );
ok( ref $blerg->{ptr} eq 'struct blergPtr');

# Fetch/Store
ok( $blerg->fetch(0) eq $data );
ok( $blerg->store($data) == $n + 1 );
$n++;
ok( $blerg->fetch($n) eq $data );

# Mute
ok( $blerg->mute(1) );
ok( $blerg->mute == 1 );
ok( $blerg->mute(0) );
ok( $blerg->mute == 0 );

# Close database
$blerg->close;

END {
	chdir;
	remove_tree "/tmp/blerg_test_$$";
}