#!/usr/bin/perl -w
use Test::More 'no_plan';
use Test::Differences;
use File::Path;
use_ok 'XS::Writer';
my $writer = XS::Writer->new(
package => 'Some::Employee',
include => <<'END',
#include "employee.h"
END
);
isa_ok $writer, 'XS::Writer';
is $writer->package, "Some::Employee";
is $writer->xs_type, "Some__Employee";
is $writer->xs_prefix, "Some__Employee_";
is $writer->xs_file, "lib/Some/Employee_struct.xsi";
is $writer->header_file,"Employee_struct.h";
$writer->struct(<<'END');
typedef struct employee {
char * name; /* this is a comment */
double salary; /* this is another comment */
int id;
// and this is a comment
};
END
$writer->xs_file( "t/test/". $writer->xs_file );
$writer->header_file( "t/test/". $writer->header_file );
my $xs = <<"END";
# Generated by XS::Writer $XS::Writer::VERSION
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "t/test/Employee_struct.h"
MODULE = Some::Employee PACKAGE = Some::Employee PREFIX = Some__Employee_
Some::Employee
Some__Employee_new( char* CLASS )
CODE:
RETVAL = ((malloc(sizeof(employee))));
if( RETVAL == NULL ) {
warn( "unable to create new Some::Employee" );
}
OUTPUT:
RETVAL
void
Some__Employee_free( Some::Employee self )
CODE:
free(self);
int
Some__Employee_id( Some::Employee self, ... )
CODE:
if( items > 1 )
self->id = SvIV(ST(1));
RETVAL = self->id;
OUTPUT:
RETVAL
char *
Some__Employee_name( Some::Employee self, ... )
CODE:
if( items > 1 )
self->name = SvPV_nolen(ST(1));
RETVAL = self->name;
OUTPUT:
RETVAL
double
Some__Employee_salary( Some::Employee self, ... )
CODE:
if( items > 1 )
self->salary = SvNV(ST(1));
RETVAL = self->salary;
OUTPUT:
RETVAL
END
eq_or_diff $writer->make_xs, $xs;
$writer->write_xs;
END { rmtree "t/test" }
ok open my $fh, $writer->xs_file
or diag "Can't open @{[ $writer->xs_file ]}: $!";
eq_or_diff join("", <$fh>), $xs;
ok open $fh, $writer->header_file
or diag "Can't open @{[ $writer->heder_file ]}: $!";
eq_or_diff join("", <$fh>), <<"END";
/* Generated by XS::Writer $XS::Writer::VERSION */
#include "employee.h"
typedef employee * Some__Employee;
END
{
my $struct = XS::Writer->new(
package => 'Something'
);
$struct->struct(<<'END');
struct foo {
char *thing;
};
END
is_deeply $struct->struct_elements, { thing => "char *" },
"can parse 'char *foo' style";
}
# Tests for packages with more than one set of ::
{
my $writer = XS::Writer->new(
package => 'Foo::Bar::Baz::Bim'
);
is $writer->xs_file, 'lib/Foo/Bar/Baz/Bim_struct.xsi';
is $writer->xs_type, 'Foo__Bar__Baz__Bim';
}