#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 14;

use List::Util qw(first);

use Config::IniFiles;

use lib "./t/lib";

use Config::IniFiles::TestPaths;

my $ini;
my @members;
my $string;

# CASE SENSITIVE CHECKS

# Test 1
# newval and val - Check that correct case brings back the correct value
$ini = Config::IniFiles->new;
$ini->newval( "Section", "PaRaMeTeR", "Mixed Case" );
$ini->newval( "Section", "Parameter", "Title Case" );
my $mixed_case = $ini->val( "Section", "PaRaMeTeR" );
my $title_case = $ini->val( "Section", "Parameter" );

# TEST
is( $mixed_case, "Mixed Case", "correct case - Mixed Case" );

# TEST
is( $title_case, "Title Case", "correct case - Title Case" );

# Test 2
# Sections
# Set up a controlled environment
$ini = Config::IniFiles->new;
$ini->newval( "Section", "Parameter", "Value" );
$ini->newval( "section", "parameter", "value" );

# TEST
is( scalar( $ini->Sections() ), 2, "2 sections" );

# Test 3
# Deleting values
# Set up a controlled environment

$ini = Config::IniFiles->new;

$ini->newval( "Section", "Parameter", "Title Case" );
$ini->newval( "Section", "parameter", "lower case" );
$ini->newval( "Section", "PARAMETER", "UPPER CASE" );

my $delete_case_check_pass = 1;

@members = $ini->Parameters("Section");

# TEST
is( scalar(@members), 3, "Delete check pass - 3 members" );

$ini->delval( "Section", "PARAMETER" );

@members = $ini->Parameters("Section");

# TEST
is( scalar(@members), 2, "Delete check pass after delete - 2 members" );

# TEST
ok( first { index( $_, "Parameter" ) >= 0 } @members, "Parameter exists" );

# TEST
ok( first { index( $_, "parameter" ) >= 0 } @members, "parameter exists" );

{
    # Test 4
    # Parameters
    $ini = Config::IniFiles->new;
    $ini->newval( "Section", "PaRaMeTeR", "Mixed Case" );
    $ini->newval( "Section", "Parameter", "Title Case" );
    $ini->newval( "SECTION", "Parameter", "N/A" );
    my @parameter_list             = $ini->Parameters("SECTION");
    my $parameters_case_check_pass = 1;
    $parameters_case_check_pass = 0 unless scalar(@parameter_list) == 1;
    $parameters_case_check_pass = 0 unless $parameter_list[0] eq "Parameter";
    @parameter_list             = $ini->Parameters("Section");
    $parameters_case_check_pass = 0 unless scalar(@parameter_list) == 2;
    my $parameters = join " ", @parameter_list;
    $parameters_case_check_pass = 0 unless ( $parameters =~ /PaRaMeTeR/ );
    $parameters_case_check_pass = 0 unless ( $parameters =~ /Parameter/ );

    # TEST
    ok( $parameters_case_check_pass, "Parameters case check pass" );
}

{
    # Test 5
    # Case sensitive handling of groups
    # Set up a controlled environment
    $ini = Config::IniFiles->new;
    $ini->newval( "interface foo",     "parameter", "foo" );
    $ini->newval( "interface bar",     "parameter", "bar" );
    $ini->newval( "INTERFACE blurgle", "parameter", "flurgle" );
    my $group_case_check_pass = 1;

    # We should have two groups - "interface" and "Interface"
    my $group_case_count = $ini->Groups();
    $group_case_check_pass = 0 unless ( $group_case_count == 2 );

    # We don't want to get the "interface" entries when we use the wrong case
    @members = $ini->GroupMembers("Interface");
    $group_case_check_pass = 0 unless ( scalar(@members) == 0 );

    # We *do* want to get the "interface" entries when we use the right case
    @members               = $ini->GroupMembers("interface");
    $group_case_check_pass = 0 unless ( scalar(@members) == 2 );
    $group_case_check_pass = 0 unless ( grep { /interface foo/ } @members );
    $group_case_check_pass = 0 unless ( grep { /interface bar/ } @members );

    # TEST
    ok( $group_case_check_pass, "Group cae check pass" );
}

# CASE INSENSITIVE CHECKS

{
    # Test 6
    # newval - Check that case-insensitive version returns one value
    $ini = Config::IniFiles->new( -nocase => "1" );
    $ini->newval( "Section", "PaRaMeTeR", "Mixed Case" );
    $ini->newval( "Section", "Parameter", "Title Case" );
    my @values = $ini->val( "Section", "parameter" );

    # TEST
    is_deeply( \@values, ["Title Case"],
        "case-insensitive version returns one value" );
}

# Test 7
# Case insensitive handling of groups
$ini = Config::IniFiles->new( -file => t_file('test.ini'), -nocase => 1 );

# TEST
is_deeply( [ $ini->GroupMembers("GrOuP") ],
    [ "group member one", "group member two", "group member three" ] );

$ini = Config::IniFiles->new(
    -file    => t_file("test.ini"),
    -default => 'test1',
    -nocase  => 1
);
$ini->SetFileName( t_file("test09.ini") );

# test 8
# Case insensitivity in parameters

# TEST
is(
    scalar( $ini->val( 'test2', 'FOUR' ) ),
    'value4', "Case insensitivity in parameters",
);

# test 9
# Case insensitivity in sections

# TEST
is(
    scalar( $ini->val( 'TEST2', 'four' ) ),
    'value4', "Case insensitivity in sections",
);

# TEST
is(
    scalar( $ini->val( 'mixedcasesect', 'mixedcaseparam' ) ),
    'MixedCaseVal', "Mixed case val.",
);

