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

use strict;
use warnings;
use Linux::Sysfs;

BEGIN {
    require 't/common.pl';
}

plan tests => 36;

# close
{
    my $module = Linux::Sysfs::Module->open_path($val_mod_path);
    isa_ok( $module, 'Linux::Sysfs::Module' );

    lives_ok(sub {
            $module->close;
    }, 'close');
}

{
    my $module = bless \(my $s), 'Linux::Sysfs::Module';

    lives_ok(sub {
            $module->close;
    }, 'close on invalid module');
}


# open_path
{
    my $module = Linux::Sysfs::Module->open_path($val_mod_path);
    isa_ok( $module, 'Linux::Sysfs::Module' );

    show_module($module);
    $module->close;
}

{
    my $module = Linux::Sysfs::Module->open_path($inval_path);
    ok( !defined $module, 'open_path with invalid path' );
}

{
    no warnings 'uninitialized';
    my $module = Linux::Sysfs::Module->open_path(undef);
    ok( !defined $module, 'open_path with undefined path' );
}


# open
{
    my $module = Linux::Sysfs::Module->open($val_mod_name);
    isa_ok( $module, 'Linux::Sysfs::Module' );

    show_module($module);
    $module->close;
}

{
    my $module = Linux::Sysfs::Module->open($inval_name);
    ok( !defined $module, 'open with invalid name' );
}

TODO: {
    local $TODO = 'will fail in future';

    no warnings 'uninitialized';
    my $module = Linux::Sysfs::Module->open(undef);
    ok( !defined $module, 'open with undefined name' );
}


# get_attr
{
    my $module = Linux::Sysfs::Module->open_path($val_mod_path);
    isa_ok( $module, 'Linux::Sysfs::Module' );

    my $attr = $module->get_attr($val_mod_attr_name);
    isa_ok( $attr, 'Linux::Sysfs::Attribute' ); #TODO: errno

    show_attribute($attr);
    
    $attr = $module->get_attr($inval_name);
    ok( !defined $attr, 'get_attr with invalid name' );

    {
        no warnings 'uninitialized';
        $attr = $module->get_attr(undef);
        ok( !defined $attr, 'get_attr with undefined name' );
    }

    $module->close;
}


# get_attributes
{
    my $module = Linux::Sysfs::Module->open_path($val_mod_path);
    isa_ok( $module, 'Linux::Sysfs::Module' );

    my @attrs = $module->get_attributes;
    ok( scalar @attrs > 0, 'get_attributes' );

    show_attribute_list(\@attrs);
    $module->close;
}

{
    my $module = bless \(my $s), 'Linux::Sysfs::Module';

    my @attrs = $module->get_attributes;
    ok( scalar @attrs == 0, 'get_attributes on invalid module' );
}


# get_parms
{
    my $module = Linux::Sysfs::Module->open_path($val_mod_path);
    isa_ok( $module, 'Linux::Sysfs::Module' );

    my @parms = $module->get_parms;
    ok( scalar @parms > 0, 'get_parms' );

    show_parm_list(\@parms);
    $module->close;
}

{
    my $module = bless \(my $s), 'Linux::Sysfs::Module';

    my @parms = $module->get_parms;
    ok( scalar @parms == 0, 'get_parms on invalid module' );
}


# get_sections
{
    my $module = Linux::Sysfs::Module->open_path($val_mod_path);
    isa_ok( $module, 'Linux::Sysfs::Module' );

    my @sects = $module->get_sections;
    ok( scalar @sects > 0, 'get_sections' );

    show_section_list(\@sects);
    $module->close;
}

{
    my $module = bless \(my $s), 'Linux::Sysfs::Module';

    my @sects = $module->get_sections;
    ok( scalar @sects == 0, 'get_sections on invalid module' );
}


# get_parm
{
    my $module = Linux::Sysfs::Module->open_path($val_mod_path);
    isa_ok( $module, 'Linux::Sysfs::Module' );

    my $parm = $module->get_parm($val_mod_parm);
    isa_ok( $parm, 'Linux::Sysfs::Attribute' ); #TODO: errno

    show_attribute($parm);

    $parm = $module->get_parm($inval_name);
    ok( !defined $parm, 'get_parm with invalid name' );

    {
        no warnings 'uninitialized';
        $parm = $module->get_parm(undef);
        ok( !defined $parm, 'get_parm with undefined name' );
    }

    $module->close;
}

{
    my $module = bless \(my $s), 'Linux::Sysfs::Module';

    my $parm = $module->get_parm($val_mod_parm);
    ok( !defined $parm, 'get_parm on invalid module' );

    $parm = $module->get_parm($inval_name);
    ok( !defined $parm, 'get_parm on invalid module with invalid name' );

    {
        no warnings 'uninitialized';
        $parm = $module->get_parm(undef);
        ok( !defined $parm, 'get_parm on invalid module with undefined name' );
    }
}


# get_section
{
    my $module = Linux::Sysfs::Module->open_path($val_mod_path);
    isa_ok( $module, 'Linux::Sysfs::Module' );

    my $sect = $module->get_section($val_mod_section);
    isa_ok( $sect, 'Linux::Sysfs::Attribute' ); #TODO: errno

    show_attribute($sect);

    $sect = $module->get_section($inval_name);
    ok( !defined $sect, 'get_section with invalid name' );

    {
        no warnings 'uninitialized';
        $sect = $module->get_section(undef);
        ok( !defined $sect, 'get_section with undefined name' );
    }

    $module->close;
}

{
    my $module = bless \(my $s), 'Linux::Sysfs::Module';

    my $sect = $module->get_section($val_mod_section);
    ok( !defined $sect, 'get_section on invalid module' );

    $sect = $module->get_section($inval_name);
    ok( !defined $sect, 'get_section on invalid module with invalid name' );

    {
        no warnings 'uninitialized';
        $sect = $module->get_section(undef);
        ok( !defined $sect, 'get_section on invalid module with undefined name' );
    }
}