Many changes
[perl-ctypes:perl-ctypes.git] / t / types.t
1 #!perl
2
3 use strict;
4 use warnings;
5 use Test::More tests => 20;
6 use Ctypes;
7 use utf8;
8
9 my $number_seven = c_int(7);
10 ok( defined $number_seven, 'c_int returned object');
11 # XXX Py ctypes has this behaviour: valuable?
12 # don't know if c_int will default to different type on 
13 # this system so do inspecific check:
14 like( ref($number_seven), qr/Ctypes::Type/, 'c_int created Type object' );
15
16 is( $$number_seven, 7, "\$\$obj: " . $$number_seven );
17
18 my $number_twelve = $number_seven;
19
20 is_deeply( $number_twelve, $number_seven, "Assignment copies object" );
21
22 $$number_seven = 15;
23 is( $$number_seven, 15, "Assign value with ->val = x" );
24
25 $$number_seven += 3;
26 is( $$number_seven, 18, '$obj += <num>' );
27 $$number_seven--;
28 is( $$number_seven, 17, '$obj -= <num>' );
29
30 is( $number_seven->typecode, 'i', "->typecode getter" );
31 is( $number_seven->typecode('p'), 'i', "typecode cannot be set" );
32
33 is( ${$number_seven->data}, pack('i', 17), "->_data getter" );
34
35 $number_seven = 20;
36 is(ref($number_seven), '', '$obj = <num> squashes object');
37
38 my $no_value = c_int;
39 ok( ref($no_value) =~ /Ctypes::Type/, 'Created object without initializer' );
40 is( $$no_value, 0, 'Default initialization to 0' );
41
42 my $number_y = c_int('y');
43 is( $$number_y, 121, 'c_int casts from non-numeric ASCII character' );
44
45 my $number_ryu = c_int('龍');
46 is( $$number_ryu, 40845, 'c_int converts from UTF-8 character' );
47 # TODO: implement this for other numeric types!
48
49 # Exceeding range on _signed_ variables is undefined in the standard,
50 # so these tests can't really be any better.
51 my $overflower = c_int(2147483648);
52 subtest 'Overflows' => sub {
53   plan tests => 6;
54   is(ref $overflower, 'Ctypes::Type::Simple');
55   isnt( $$overflower, 2147483648);
56   ok( $$overflower <= Ctypes::constant('PERL_INT_MAX'),
57       'Cannot exceed INT_MAX');
58   $$overflower = -2147483649;
59   is(ref $overflower, 'Ctypes::Type::Simple');
60   isnt( $$overflower,-2147483649);
61   ok( $$overflower >= Ctypes::constant('PERL_INT_MIN'),
62       'Cannot go below INT_MIN');
63 };
64 $$overflower = 5;
65 $overflower->allow_overflow(0);
66 $$overflower = 2147483648;
67 is($$overflower, 5, 'Disallow overflow per-object');
68 $overflower->allow_overflow(1);
69 Ctypes::Type::allow_overflow_all(0);
70 $overflower = c_int(2147483648);
71 is($overflower, undef, 'Can (dis)allow_overflow_all');
72
73 TODO: {
74   local $TODO = 'chars are integers - need Perl-side hooks for displaying as chars';
75   my $charar = c_char('P');
76   is( $$charar, 'P', 'c_char shows as 1-char strings in Perl' );
77   my $ret_as_char = c_char(89);
78   is( $$ret_as_char, 'Y', 'c_char converts from numbers' );
79 }