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

BEGIN { plan tests => 19 }

my %ini;
my ($ini, $value);
my (@value);

# Get files from the 't' directory, portably
chdir('t') if ( -d 't' );
unlink "test05.ini";


# Test 1
# Tying a hash.
ok( tie %ini, 'Config::IniFiles', ( -file => "test.ini", -default => 'test1', -nocase => 1 ) );
tied(%ini)->SetFileName("test05.ini");
tied(%ini)->SetWriteMode("0666");

# Test 2
# Retrieve scalar value
$value = $ini{test1}{one};
ok($value eq 'value1');

# Test 3
# Retrieve array reference
$value = $ini{test1}{mult};
ok(ref $value eq 'ARRAY'); 

# Test 4
# Creating a scalar value using tied hash
$ini{'test2'}{'seven'} = 'value7';
tied(%ini)->RewriteConfig;
tied(%ini)->ReadConfig;
$value = $ini{'test2'}{'seven'};
ok($value eq 'value7');

# Test 5
# Deleting a scalar value using tied hash
delete $ini{test2}{seven};
tied(%ini)->RewriteConfig;
tied(%ini)->ReadConfig;
$value='';
$value = $ini{test2}{seven};
ok(! defined ($value));

# Test 6
# Testing default values using tied hash
ok( $ini{test2}{three} eq 'value3' );

# Test 7
# Case insensitivity in a hash parameter
ok( $ini{test2}{FOUR} eq 'value4' );

# Test 8
# Case insensitivity in a hash section
ok( $ini{TEST2}{four} eq 'value4' );

# Test 9
# Listing section names using keys
$value = 1;
$ini = new Config::IniFiles( -file => "test.ini" );
$ini->SetFileName("test05b.ini");
my @S1 = $ini->Sections;
my @S2 = keys %ini;
foreach (@S1) {
	unless( (grep "$_", @S2) &&
	        (grep "$_", qw( test1 test2 [w]eird characters ) ) ) {
		$value = 0;
		last;
	}
}
ok( $value );

# Test 10
# Listing parameter names using keys
$value = 1;
@S1 = $ini->Parameters('test1');
@S2 = keys %{$ini{test1}};
foreach (@S1) {
	unless( (grep "$_", @S2) &&
	        (grep "$_", qw( three two one ) ) ) {
		$value = 0;
		last;
	}
}
ok($value);

# Test 11
# Copying a section using tied hash
my %bak = %{$ini{test2}};
$value = $bak{six} || '';
ok( $value eq 'value6' );

# Test 12
# Deleting a whole section using tied hash
delete $ini{test2};
$value = $ini{test2};
ok(not $value);

# Test 13
# Creating a section and parameters using a hash
$ini{newsect} = {};
%{$ini{newsect}} = %bak;
$value = $ini{newsect}{four} || '';
ok( $value eq 'value4' );

# Test 14
# Checking use of default values for newly created section
$value = $ini{newsect}{one};
ok( $value eq 'value1' );

# Test 15
# print "Store new section in hash ........ ";
tied(%ini)->RewriteConfig;
tied(%ini)->ReadConfig;
$value = $ini{newsect}{four} || '';
ok( $value eq 'value4' );

# Test 16
# Writing 2 line multilvalue and returing it
$ini{newsect} = {};
$ini{test1}{multi_2} = ['line 1', 'line 2'];
tied(%ini)->RewriteConfig;
tied(%ini)->ReadConfig;
@value = @{$ini{test1}{multi_2}};
ok( (@value == 2) 
    && ($value[0] eq 'line 1')
    && ($value[1] eq 'line 2')
  );

# Test 17
# Getting a default value not in the file
tie %ini, 'Config::IniFiles', ( -file => "test.ini", -default => 'default', -nocase => 1 );
$ini{default}{cassius} = 'clay';
$value = $ini{test1}{cassius};
ok( $value eq 'clay' );

# Test 18
# Setting value to number of elements in array
my @thing = ("one", "two", "three");
$ini{newsect}{five} = @thing;
$value = $ini{newsect}{five};
ok($value == 3);

# Test 19
# Setting value to number of elements in array
@thing = ("one");
$ini{newsect}{five} = @thing;
$value = $ini{newsect}{five};
ok($value == 1);

# Clean up when we're done
unlink "test05.ini";