Many changes
[perl-ctypes:shlomifs-perl-ctypes.git] / t / Union.t
1 #!perl
2
3 use Test::More tests => 1;
4 use Ctypes;
5 use Data::Dumper;
6 my $Debug = 0;
7
8 #
9 #  Self-referential example~~
10 #
11 #  typedef union {
12 #    signed int    sint;
13 #    unsigned int  uint;
14 #    float         flt;
15 #    char          data[FFI_SIZEOF_JAVA_RAW];
16 #    void*         ptr;
17 #  } ffi_java_raw;
18 #
19
20 my $ffi_java_raw = Union({ fields => [
21   [ sint => c_int ],
22   [ uint => c_uint ],
23   [ flt  => c_float ],
24   [ data => Array( c_char, [0..7] ) ],
25   [ ptr  => Pointer( c_void_p ) ], ] });
26
27 isa_ok( $ffi_java_raw, 'Ctypes::Type::Union', 'Union created ok' );
28
29 is( $ffi_java_raw->size, 8, 'Size is that of largest member' );
30 is( $ffi_java_raw->name, 'iIfpp_Union', 'Name modified correctly' );
31
32 ok( $ffi_java_raw->field_list->[0][0] eq 'sint'
33   && $ffi_java_raw->field_list->[1][1]->typecode eq 'I',
34   '$st->field_list returns names and type names' );
35
36 is( $$ffi_java_raw->data->[6], 0, 'All members initialized to 0' );
37
38 $ffi_java_raw->sint->(25);
39 is( $$ffi_java_raw->sint, 25, 'Values in & out to simple members' );
40
41 # this test needs to be in Array.t and maybe Struct.t
42 $$ffi_java_raw->data->[0] = 80;
43
44 is( $$ffi_java_raw->data->[0], 80, 'Vals in & out to compound members' );
45
46 # test for setting undef needs moved to types.t
47 # $ffi_java_raw->sint->(undef);
48
49 is( $$ffi_java_raw->sint, 0, 'Setting one member erases others' );
50
51