Win32::API::Struct's tests generate garbage structs

[email protected] (bulk 88)
Newsgroups perl.libwin32
Message-ID <[email protected]>
I ran into a problem. I made another improvement to Win32::API, in ::Struct, to fix this div by zero, http://perlmonks.org/?node_id=978667 . No changes to recognize(), since recognize already has a way
to signal failure, its just typedef() didn't check for failure before. recognize() indicated failure by returning a list with 1 undef, rather than the non-error list with 3 elements. The undefs/missing array elements later become 0s which after that become div by 0s.
_____________________________________________
sub typedef {
    my $class  = shift;
    my $struct = shift;
    my ($type, $name, @recog_arr);
    my $self = {
        align   => undef,
        typedef => [],
    };
    while (defined($type = shift)) {
        $name = shift;
        $name =~ s/;$//;
        @recog_arr = recognize($type, $name);
#http://perlmonks.org/?node_id=978468, not catching the type not found here,
#will lead to a div 0 later
        if(@recog_arr != 3){ 
            warn "Win32::API::Struct::typedef: unknown member type=\"$type\", name=\"$name\"";
            return undef;
        }
        push(@{$self->{typedef}}, [@recog_arr]);
    }

    $Known{$struct} = $self;
    return 1;
}
_____________________________________________
the problem is 05_more_struct.t now fails its tests, specifically, 
_____________________________________________
C:\Documents and Settings\Owner\Desktop\cpan libs\Win32API\wrkinprog>perl ./t/05
_more_struct.t
1..28
ok 1 - "all_longs" struct defined
ok 2 - Size of struct "all_longs" is calculated correctly (20)
ok 3 - "array_of_chars" struct defined
ok 4 - Size of struct "array_of_chars" is calculated correctly (100)
ok 5 - "compound_1" struct defined
ok 6 - Size of struct "compound_1" is calculated correctly (212)
ok 7 - "compound_2" struct defined
not ok 8 - Size of struct "compound_2" is calculated correctly (14) # TODO Break
s atm
#   Failed (TODO) test 'Size of struct "compound_2" is calculated correctly (14)
'
#   at ./t/05_more_struct.t line 131.
#          got: '14'
#     expected: '11'
ok 9 - "empty" struct defined
ok 10 - Size of struct "empty" is calculated correctly (0)
Win32::API::Struct::typedef: unknown member type="\n", name="\n" at C:/perl512/s
ite/lib/Win32/API/Struct.pm line 46.
Unknown Win32::API::Struct 'empty_with_spaces' at ./t/05_more_struct.t line 125
not ok 11 - "empty_with_spaces" struct defined
#   Failed test '"empty_with_spaces" struct defined'
#   at ./t/05_more_struct.t line 126.
Can't call method "sizeof" on an undefined value at ./t/05_more_struct.t line 13
5.
# Looks like you planned 28 tests but ran 11.
# Looks like you failed 1 test of 11 run.
# Looks like your test exited with 2 just after 11.

C:\Documents and Settings\Owner\Desktop\cpan libs\Win32API\wrkinprog>
________________________________________________
if I comment out
_________________________________________________
    empty_with_spaces => {
        typedef => [qw(  \n   \n  )],
        sizeof  => 0,
    },
_________________________________________________
in 05_more_struct.t, 05_more_struct.t passes all its tests.

Since you (Cosimo) originally wrote 05_more_struct.t (I assume, per https://github.com/cosimo/perl5-win32-api/commit/99a1506e8a941f9625ead648c207f4639f9cbf07#t/05_more_struct.t ), I ask, what should I do?

Some ideas,
-make empty_with_spaces pass its tests (a 0 length struct is created successfully) at any cost (no idea how to implement, some kind of whitespace stripper/normalizer regex before passing off the string to defined/while?)
-remove empty_with_spaces test, note "empty" works fine with the new ::Struct
-or you (Cosimo) have your own idea how to fix this?

This email is going to Cosimo and libwin32 mailing list, anyone can give their opinion.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.