1use Test2::V0 -no_srand => 1;
2use FFI::Platypus::Constant;
3use File::Path qw( mkpath );
4use File::Basename qw( dirname );
5use FFI::Temp;
6
7subtest 'very very basic...' => sub {
8
9  my $api = FFI::Platypus::Constant->new;
10  isa_ok $api, 'FFI::Platypus::Constant';
11  undef $api;
12  ok 'did not appear to crash :tada:';
13
14};
15
16subtest 'create constants' => sub {
17
18  my $root = FFI::Temp->newdir;
19  spew("$root/lib/Foo/Bar1.pm", <<'EOF');
20    package Foo::Bar1;
21    use strict;
22    use warnings;
23    use FFI::Platypus;
24    my $ffi = FFI::Platypus->new( api => 1, lang => 'ASM' );
25    $ffi->bundle;
26    1;
27EOF
28
29  spew("$root/ffi/bar1.c", <<'EOF');
30#include <ffi_platypus_bundle.h>
31    void ffi_pl_bundle_constant(const char *package, ffi_platypus_constant_t *b)
32    {
33      b->set_str("FOO1", "VAL1");
34      b->set_str("Foo::Bar1::Baz::FOO2", "VAL2");
35      b->set_sint("FOO3", -42);
36      b->set_uint("FOO4", 512);
37      b->set_double("FOO5", 2.5);
38      b->set_str("FOO6", package);
39    }
40EOF
41
42  local @INC = @INC;
43  unshift @INC, "$root/lib";
44  local $@ = '';
45  eval " require Foo::Bar1; ";
46  is "$@", '';
47
48  is( Foo::Bar1::FOO1(), "VAL1" );
49  is( Foo::Bar1::Baz::FOO2(), "VAL2" );
50  is( Foo::Bar1::FOO3(), -42 );
51  is( Foo::Bar1::FOO4(), 512 );
52  is( Foo::Bar1::FOO5(), 2.5 );
53  is( Foo::Bar1::FOO6(), "Foo::Bar1" );
54
55};
56
57done_testing;
58
59sub spew
60{
61  my($fn, $content) = @_;
62
63  note "spew(start)[$fn]\n";
64  note $content;
65  note "spew(end)\n";
66
67  my $dir = dirname $fn;
68  mkpath $dir, 0, oct(755) unless -d $dir;
69  open my $fh, '>', $fn;
70  print $fh $content;
71  close $fh;
72}
73