1use strict;
2use warnings;
3use Test::More tests => 51;
4BEGIN { use_ok('primitive_types') }
5require_ok('primitive_types');
6
7primitive_types::var_init();
8
9# assigning globals calls
10$primitive_types::var_bool = $primitive_types::sct_bool;
11$primitive_types::var_schar = $primitive_types::sct_schar;
12$primitive_types::var_uchar = $primitive_types::sct_uchar;
13$primitive_types::var_int = $primitive_types::sct_int;
14$primitive_types::var_uint = $primitive_types::sct_uint;
15$primitive_types::var_short = $primitive_types::sct_short;
16$primitive_types::var_ushort = $primitive_types::sct_ushort;
17$primitive_types::var_long = $primitive_types::sct_long;
18$primitive_types::var_ulong = $primitive_types::sct_ulong;
19$primitive_types::var_llong = $primitive_types::sct_llong;
20$primitive_types::var_ullong = $primitive_types::sct_ullong;
21$primitive_types::var_char = $primitive_types::sct_char;
22$primitive_types::var_pchar = $primitive_types::sct_pchar;
23$primitive_types::var_pcharc = $primitive_types::sct_pcharc;
24$primitive_types::var_pint = $primitive_types::sct_pint;
25$primitive_types::var_sizet = $primitive_types::sct_sizet;
26$primitive_types::var_hello = $primitive_types::sct_hello;
27$primitive_types::var_myint = $primitive_types::sct_myint;
28$primitive_types::var_namet = $primitive_types::def_namet;
29$primitive_types::var_parami = $primitive_types::sct_parami;
30$primitive_types::var_paramd = $primitive_types::sct_paramd;
31$primitive_types::var_paramc = $primitive_types::sct_paramc;
32
33ok(primitive_types::v_check(), "v_check");
34
35#def pyerror(name, val, cte):
36#  print "bad val/cte", name, val, cte
37#  raise RuntimeError
38#  pass
39
40is($primitive_types::var_bool, $primitive_types::cct_bool, "bool");
41is($primitive_types::var_schar, $primitive_types::cct_schar, "schar");
42is($primitive_types::var_uchar, $primitive_types::cct_uchar, "uchar");
43is($primitive_types::var_int, $primitive_types::cct_int, "int");
44is($primitive_types::var_uint, $primitive_types::cct_uint, "uint");
45is($primitive_types::var_short, $primitive_types::cct_short, "short");
46is($primitive_types::var_ushort, $primitive_types::cct_ushort, "ushort");
47is($primitive_types::var_long, $primitive_types::cct_long, "long");
48is($primitive_types::var_ulong, $primitive_types::cct_ulong, "ulong");
49is($primitive_types::var_llong, $primitive_types::cct_llong, "llong");
50is($primitive_types::var_ullong, $primitive_types::cct_ullong, "ullong");
51is($primitive_types::var_char, $primitive_types::cct_char, "char");
52is($primitive_types::var_pchar, $primitive_types::cct_pchar, "pchar");
53is($primitive_types::var_pcharc, $primitive_types::cct_pcharc, "pchar");
54is($primitive_types::var_pint, $primitive_types::cct_pint, "pint");
55is($primitive_types::var_sizet, $primitive_types::cct_sizet, "sizet");
56is($primitive_types::var_hello, $primitive_types::cct_hello, "hello");
57is($primitive_types::var_myint, $primitive_types::cct_myint, "myint");
58is($primitive_types::var_namet, $primitive_types::def_namet, "name");
59
60#class PyTest (TestDirector):
61#  def __init__(self):
62#    TestDirector.__init__(self)
63#    pass
64#  def ident(self, x):
65#    return x
66#
67#  def vval_bool(self, x): return self.ident(x)
68#  def vval_schar(self, x): return self.ident(x)
69#  def vval_uchar(self, x): return self.ident(x)
70#  def vval_int(self, x): return self.ident(x)
71#  def vval_uint(self, x): return self.ident(x)
72#  def vval_short(self, x): return self.ident(x)
73#  def vval_ushort(self, x): return self.ident(x)
74#  def vval_long(self, x): return self.ident(x)
75#  def vval_ulong(self, x): return self.ident(x)
76#  def vval_llong(self, x): return self.ident(x)
77#  def vval_ullong(self, x): return self.ident(x)
78#  def vval_float(self, x): return self.ident(x)
79#  def vval_double(self, x): return self.ident(x)
80#  def vval_char(self, x): return self.ident(x)
81#  def vval_pchar(self, x): return self.ident(x)
82#  def vval_pcharc(self, x): return self.ident(x)
83#  def vval_pint(self, x): return self.ident(x)
84#  def vval_sizet(self, x): return self.ident(x)
85#  def vval_hello(self, x): return self.ident(x)
86#  def vval_myint(self, x): return self.ident(x)
87#
88#  def vref_bool(self, x): return self.ident(x)
89#  def vref_schar(self, x): return self.ident(x)
90#  def vref_uchar(self, x): return self.ident(x)
91#  def vref_int(self, x): return self.ident(x)
92#  def vref_uint(self, x): return self.ident(x)
93#  def vref_short(self, x): return self.ident(x)
94#  def vref_ushort(self, x): return self.ident(x)
95#  def vref_long(self, x): return self.ident(x)
96#  def vref_ulong(self, x): return self.ident(x)
97#  def vref_llong(self, x): return self.ident(x)
98#  def vref_ullong(self, x): return self.ident(x)
99#  def vref_float(self, x): return self.ident(x)
100#  def vref_double(self, x): return self.ident(x)
101#  def vref_char(self, x): return self.ident(x)
102#  def vref_pchar(self, x): return self.ident(x)
103#  def vref_pcharc(self, x): return self.ident(x)
104#  def vref_pint(self, x): return self.ident(x)
105#  def vref_sizet(self, x): return self.ident(x)
106#  def vref_hello(self, x): return self.ident(x)
107#  def vref_myint(self, x): return self.ident(x)
108#
109#  pass
110
111
112my $t = primitive_types::Test->new();
113#p = PyTest()
114#
115#
116# internal call check
117#if t.c_check() != p.c_check():
118#  raise RuntimeError, "bad director"
119#
120#p.var_bool = p.stc_bool
121#p.var_schar = p.stc_schar
122#p.var_uchar = p.stc_uchar
123#p.var_int = p.stc_int
124#p.var_uint = p.stc_uint
125#p.var_short = p.stc_short
126#p.var_ushort = p.stc_ushort
127#p.var_long = p.stc_long
128#p.var_ulong = p.stc_ulong
129#p.var_llong = p.stc_llong
130#p.var_ullong = p.stc_ullong
131#p.var_char = p.stc_char
132#p.var_pchar = sct_pchar
133#p.var_pcharc = sct_pcharc
134#p.var_pint = sct_pint
135#p.var_sizet = sct_sizet
136#p.var_hello = sct_hello
137#p.var_myint = sct_myint
138#p.var_namet = def_namet
139#p.var_parami = sct_parami
140#p.var_paramd = sct_paramd
141#p.var_paramc = sct_paramc
142#
143#p.v_check()
144
145$t->{var_bool} = $primitive_types::Test::stc_bool;
146$t->{var_schar} = $primitive_types::Test::stc_schar;
147$t->{var_uchar} = $primitive_types::Test::stc_uchar;
148$t->{var_int} = $primitive_types::Test::stc_int;
149$t->{var_uint} = $primitive_types::Test::stc_uint;
150$t->{var_short} = $primitive_types::Test::stc_short;
151$t->{var_ushort} = $primitive_types::Test::stc_ushort;
152$t->{var_long} = $primitive_types::Test::stc_long;
153$t->{var_ulong} = $primitive_types::Test::stc_ulong;
154$t->{var_llong} = $primitive_types::Test::stc_llong;
155$t->{var_ullong} = $primitive_types::Test::stc_ullong;
156$t->{var_char} = $primitive_types::Test::stc_char;
157$t->{var_pchar} = $primitive_types::sct_pchar;
158$t->{var_pcharc} = $primitive_types::sct_pcharc;
159$t->{var_pint} = $primitive_types::sct_pint;
160$t->{var_sizet} = $primitive_types::sct_sizet;
161$t->{var_hello} = $primitive_types::sct_hello;
162$t->{var_myint} = $primitive_types::sct_myint;
163$t->{var_namet} = $primitive_types::def_namet;
164$t->{var_parami} = $primitive_types::sct_parami;
165$t->{var_paramd} = $primitive_types::sct_paramd;
166$t->{var_paramc} = $primitive_types::sct_paramc;
167ok($t->v_check(), 'v_check');
168
169is($primitive_types::def_namet, "hola", "namet");
170$t->{var_namet} = $primitive_types::def_namet;
171is($t->{var_namet}, $primitive_types::def_namet, "namet");
172
173$t->{var_namet} = 'hola';
174
175is($t->{var_namet}, 'hola', "namet");
176
177$t->{var_namet} = 'hol';
178
179is($t->{var_namet}, 'hol', "namet");
180
181
182$primitive_types::var_char = "\0";
183is($primitive_types::var_char, "\0", "char '0' case");
184
185$primitive_types::var_char = 0;
186is($primitive_types::var_char, "\0", "char '0' case");
187
188$primitive_types::var_namet = "\0";
189is($primitive_types::var_namet, '', "char '\\0' case");
190
191$primitive_types::var_namet = '';
192is($primitive_types::var_namet, '', "char empty case");
193
194$primitive_types::var_pchar = undef;
195is($primitive_types::var_pchar, undef, "undef case");
196
197$primitive_types::var_pchar = '';
198is($primitive_types::var_pchar, '', "char empty case");
199
200$primitive_types::var_pcharc = undef;
201is($primitive_types::var_pcharc, undef, "undef case");
202
203$primitive_types::var_pcharc = '';
204is($primitive_types::var_pcharc, '', "char empty case");
205
206
207#
208# creating a raw char*
209#
210my $pc = primitive_types::new_pchar(5);
211primitive_types::pchar_setitem($pc, 0, 'h');
212primitive_types::pchar_setitem($pc, 1, 'o');
213primitive_types::pchar_setitem($pc, 2, 'l');
214primitive_types::pchar_setitem($pc, 3, 'a');
215primitive_types::pchar_setitem($pc, 4, 0);
216
217
218$primitive_types::var_pchar = $pc;
219is($primitive_types::var_pchar, "hola", "pointer case");
220
221$primitive_types::var_namet = $pc;
222is($primitive_types::var_namet, "hola", "pointer case");
223
224primitive_types::delete_pchar($pc);
225
226#
227# Now when things should fail
228#
229
230{
231	my $orig = $t->{var_uchar};
232	eval { $t->{var_uchar} = 10000 };
233	like($@, qr/\bOverflowError\b/, "uchar typemap");
234	is($orig, $t->{var_uchar}, "uchar typemap");
235}
236{
237	my $orig = $t->{var_char};
238	#eval { $t->{var_char} = "23" }; Perl will gladly make a number out of that
239	eval { $t->{var_char} = "twenty-three" };
240	like($@, qr/\bTypeError\b/, "char typemap");
241	is($orig, $t->{var_char}, "char typemap");
242}
243{
244	my $orig = $t->{var_uint};
245	eval { $t->{var_uint} = -1 };
246	like($@, qr/\bOverflowError\b/, "uint typemap");
247	is($orig, $t->{var_uint}, "uint typemap");
248}
249{
250	my $orig = $t->{var_namet};
251	eval { $t->{var_namet} = '123456' };
252	like($@, qr/\bTypeError\b/, "namet typemap");
253	is($orig, $t->{var_namet}, "namet typemap");
254}
255#t2 = p.vtest(t)
256#if t.var_namet !=  t2.var_namet:
257#  raise RuntimeError, "bad SWIGTYPE* typemap"
258
259is($primitive_types::fixsize, "ho\0la\0\0\0", "FIXSIZE typemap");
260
261$primitive_types::fixsize = 'ho';
262is($primitive_types::fixsize, "ho\0\0\0\0\0\0", "FIXSIZE typemap");
263
264
265my $f = primitive_types::Foo->new(3);
266my $f1 = primitive_types::fptr_val($f);
267my $f2 = primitive_types::fptr_ref($f);
268is($f1->{_a}, $f2->{_a}, "const ptr& typemap");
269
270
271is(primitive_types::char_foo(1,3), 3, "int typemap");
272
273is(primitive_types::char_foo(1,"hello"), "hello", "char* typemap");
274
275is(primitive_types::SetPos(1,3), 4, "int typemap");
276