The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;

# Should be 10.
use Test::More tests => 10;

use Config::IniFiles;

use lib "./t/lib";

use Config::IniFiles::Debug;
use Config::IniFiles::TestPaths;

my ( $value, @value );
umask 0000;

my $ini = Config::IniFiles->new( -file => t_file("test.ini") );
$ini->_assert_invariants();
t_unlink("test01.ini");
$ini->SetFileName( t_file("test01.ini") );
$ini->SetWriteMode("0666");

# TEST
ok( $ini, "Loading from a file" );

$value = $ini->val( 'test1', 'one' );
$ini->_assert_invariants();

# TEST
is( $value, 'value1', "Reading a single value in scalar context" );

@value = $ini->val( 'test1', 'one' );
$ini->_assert_invariants();

# TEST
is( $value[0], 'value1', "Reading a single value in list context" );

$value = $ini->val( 'test1', 'mult' );

# TEST
is( $value, "one$/two$/three", "Reading a multiple value in scalar context" );

@value = $ini->val( 'test1', 'mult' );
$value = join "|", @value;

# TEST
is_deeply(
    \@value,
    [ "one", "two", "three" ],
    "Reading a multiple value in list context",
);

@value = ( "one", "two", "three" );
$ini->newval( 'test1', 'eight', @value );
$ini->_assert_invariants();
$value = $ini->val( 'test1', 'eight' );

# TEST
is( $value, "one$/two$/three", "Creating a new multiple value", );

$ini->newval( 'test1', 'seven', 'value7' );
$ini->_assert_invariants();
$ini->RewriteConfig;
$ini->ReadConfig;
$ini->_assert_invariants();
$value = '';
$value = $ini->val( 'test1', 'seven' );
$ini->_assert_invariants();

# TEST
is( $value, 'value7', "Creating a new value", );

$ini->delval( 'test1', 'seven' );
$ini->_assert_invariants();
$ini->RewriteConfig;
$ini->ReadConfig;
$ini->_assert_invariants();
$value = '';
$value = $ini->val( 'test1', 'seven' );

# TEST
ok( !defined($value), "Deleting a value" );

$value = $ini->val( 'test1', 'not a real parameter name', '12345' );

# TEST
is( $value, '12345', "Reading a default values from existing section" );

$value =
    $ini->val( 'not a real section', 'no parameter by this name', '12345' );

# TEST
is( $value, '12345', "Reading a default values from non-existent section" );

# Clean up when we're done
t_unlink("test01.ini");