import source from 1.3.40
[external/swig.git] / Examples / test-suite / perl5 / overload_simple_runme.pl
1 #!/usr/bin/perl -w
2 use overload_simple;
3 use vars qw/$DOWARN/;
4 use strict;
5 use Test::More tests => 71;
6
7 pass("loaded");
8
9 my $f = new overload_simple::Foo();
10 isa_ok($f, "overload_simple::Foo");
11 my $b = new overload_simple::Bar();
12 isa_ok($b, "overload_simple::Bar");
13 my $v = overload_simple::malloc_void(32);
14 isa_ok($v, "_p_void");
15
16
17 #
18 # Silence warnings about bad types
19 #
20 BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] if $DOWARN } }
21 #
22 #these tests should 'fail'
23 #
24 eval { overload_simple::fint("l") };
25 ok($@, "fint(int) - int");
26
27 eval { overload_simple::fint("3.5") };
28 ok($@, "fint(int) - double");
29
30 eval { overload_simple::fdouble("l") };
31 ok($@, "fint(double) - int");
32
33 eval { overload_simple::fdouble("1.5/2.0") };
34 ok($@, "fint(double) - double");
35
36 #
37 #enable the warnings again
38 #
39 $DOWARN =1;
40
41 #
42 # 'simple' dispatch (no overload) of int and double arguments
43 #
44
45 is(overload_simple::fint(3), "fint:int", "fint(int) - int");
46
47 is(overload_simple::fint("1"), "fint:int", "fint(int) - string int");
48
49 is(overload_simple::fint(3.0), "fint:int", "fint(int) - double");
50
51 is(overload_simple::fint("3.0"), "fint:int", "fint(int) - string double");
52
53 # old bad case that now works
54 my $n = 3;
55 $n = $n + 1;
56 is(overload_simple::fint($n), "fint:int", "fint(int) - int var");
57
58 is(overload_simple::fint(4/2), "fint:int", "fint(int) - divide int denom");
59
60 is(overload_simple::fint(4/2.0), "fint:int", "fint(int) - divide double denom");
61
62 is(overload_simple::fdouble(3), "fdouble:double", "fdouble(double) - int");
63
64 is(overload_simple::fdouble("3"), "fdouble:double", "fdouble(double) - string int");
65
66 is(overload_simple::fdouble(3.0), "fdouble:double", "fdouble(double) - double");
67
68 is(overload_simple::fdouble("3.0"), "fdouble:double", "fdouble(double) - string doubl");
69
70 #
71 # Overload between int and double
72 #
73 is(overload_simple::num(3), "num:int", "num(int) - int");
74
75 is(overload_simple::num("3"), "num:int", "num(int) - string int");
76
77 is(overload_simple::num(3.0), "num:double", "num(int) - double");
78
79 is(overload_simple::num("3.0"), "num:double", "num(int) - string double");
80
81 #
82 # Overload between int, double, char * and many types.
83 #
84 is(overload_simple::foo(3), "foo:int", "foo:int - int");
85
86 is(overload_simple::foo(3.0), "foo:double", "foo:double - double");
87
88 is(overload_simple::foo("3"), "foo:char *", "foo:char * - string int");
89
90 is(overload_simple::foo("3.0"), "foo:char *", "foo:char * - string double");
91
92 is(overload_simple::foo("hello"), "foo:char *", "foo:char * string");
93
94 is(overload_simple::foo($f), "foo:Foo *", "foo:Foo *");
95
96 is(overload_simple::foo($b), "foo:Bar *", "foo:Bar *");
97
98 is(overload_simple::foo($v), "foo:void *", "foo:void *");
99
100 is(overload_simple::blah(3), "blah:double", "blah:double");
101
102 is(overload_simple::blah("hello"), "blah:char *", "blah:char *");
103
104 my $s = new overload_simple::Spam();
105
106 is($s->foo(3), "foo:int", "Spam::foo:int");
107
108 is($s->foo(3.0), "foo:double", "Spam::foo(double)");
109
110 is($s->foo("hello"), "foo:char *", "Spam::foo:char *");
111
112 is($s->foo($f), "foo:Foo *", "Spam::foo(Foo *)");
113
114 is($s->foo($b), "foo:Bar *", "Spam::foo(Bar *)");
115
116 is($s->foo($v), "foo:void *", "Spam::foo(void *)");
117
118 is(overload_simple::Spam::bar(3), "bar:int", "Spam::bar(int)");
119
120 is(overload_simple::Spam::bar(3.0), "bar:double", "Spam::bar(double)");
121
122 is(overload_simple::Spam::bar("hello"), "bar:char *", "Spam::bar(char *)");
123
124 is(overload_simple::Spam::bar($f), "bar:Foo *", "Spam::bar(Foo *)");
125
126 is(overload_simple::Spam::bar($b), "bar:Bar *", "Spam::bar(Bar *)");
127
128 is(overload_simple::Spam::bar($v), "bar:void *", "Spam::bar(void *)");
129
130 # Test constructors
131
132 $s = new overload_simple::Spam();
133 isa_ok($s, "overload_simple::Spam");
134
135 is($s->{type}, "none", "Spam()");
136
137 $s = new overload_simple::Spam(3);
138 isa_ok($s, "overload_simple::Spam");
139
140 is($s->{type}, "int", "Spam(int)");
141
142 $s = new overload_simple::Spam(3.0);
143 isa_ok($s, "overload_simple::Spam");
144 is($s->{type}, "double", "Spam(double)");
145
146 $s = new overload_simple::Spam("hello");
147 isa_ok($s, "overload_simple::Spam");
148 is($s->{type}, "char *", "Spam(char *)");
149
150 $s = new overload_simple::Spam($f);
151 isa_ok($s, "overload_simple::Spam");
152 is($s->{type}, "Foo *", "Spam(Foo *)");
153
154 $s = new overload_simple::Spam($b);
155 isa_ok($s, "overload_simple::Spam");
156 is($s->{type}, "Bar *", "Spam(Bar *)");
157
158 $s = new overload_simple::Spam($v);
159 isa_ok($s, "overload_simple::Spam");
160 is($s->{type}, "void *", "Spam(void *)");
161
162 #
163 # Combine dispatch
164 #
165
166
167 is(overload_simple::fid(3, 3.0), "fid:intdouble", "fid(int,double)");
168
169 is(overload_simple::fid(3.0, 3), "fid:doubleint", "fid(double,int)");
170
171 is(overload_simple::fid(3.0, 3.0), "fid:doubledouble", "fid(double,double)");
172
173 is(overload_simple::fid(3, 3), "fid:intint", "fid(int,int)");
174
175 # with strings now
176
177 is(overload_simple::fid(3, "3.0"), "fid:intdouble", "fid(int,double)");
178
179 is(overload_simple::fid("3", 3.0), "fid:intdouble", "fid(int,double)");
180
181 is(overload_simple::fid("3", "3.0"), "fid:intdouble", "fid(int,double)");
182
183 is(overload_simple::fid(3.0, "3"), "fid:doubleint", "fid(double,int)");
184
185 is(overload_simple::fid("3.0", "3.0"), "fid:doubledouble", "fid:doubledouble");
186
187 is(overload_simple::fid("3", 3), "fid:intint", "fid:fid(int,int)");
188
189 isnt(overload_simple::fbool(0), overload_simple::fbool(1), "fbool(bool)");
190
191 is(2, overload_simple::fbool(2), "fbool(int)");