2 # (C) 2007 Jelmer Vernooij <jelmer@samba.org>
3 # Published under the GNU General Public License
7 use Test::More tests => 37;
8 use FindBin qw($RealBin);
11 use Parse::Pidl::Util qw(MyDumper);
12 use Parse::Pidl::NDR qw(GetElementLevelTable ParseElement align_type mapToScalar ParseType can_contain_deferred);
22 'PARENT' => { TYPE => 'STRUCT' },
25 is_deeply(GetElementLevelTable($e), [
29 'DATA_TYPE' => 'uint8',
30 'CONTAINS_DEFERRED' => 0,
32 'IS_SURROUNDING' => 0,
36 my $ne = ParseElement($e, undef);
37 is($ne->{ORIGINAL}, $e);
40 is($ne->{TYPE}, "uint8");
41 is_deeply($ne->{LEVELS}, [
45 'DATA_TYPE' => 'uint8',
46 'CONTAINS_DEFERRED' => 0,
48 'IS_SURROUNDING' => 0,
57 'PROPERTIES' => {"unique" => 1},
59 'PARENT' => { TYPE => 'STRUCT' },
63 is_deeply(GetElementLevelTable($e), [
68 POINTER_TYPE => "unique",
75 'DATA_TYPE' => 'uint8',
76 'CONTAINS_DEFERRED' => 0,
78 'IS_SURROUNDING' => 0,
82 # Case 3 : double pointers
87 'PROPERTIES' => {"unique" => 1},
90 'PARENT' => { TYPE => 'STRUCT' },
93 is_deeply(GetElementLevelTable($e), [
98 POINTER_TYPE => "unique",
106 POINTER_TYPE => "unique",
113 'DATA_TYPE' => 'uint8',
114 'CONTAINS_DEFERRED' => 0,
116 'IS_SURROUNDING' => 0,
120 # Case 3 : ref pointers
125 'PROPERTIES' => {"ref" => 1},
128 'PARENT' => { TYPE => 'STRUCT' },
131 is_deeply(GetElementLevelTable($e), [
136 POINTER_TYPE => "ref",
143 'DATA_TYPE' => 'uint8',
144 'CONTAINS_DEFERRED' => 0,
146 'IS_SURROUNDING' => 0,
151 # Case 4 : top-level ref pointers
156 'PROPERTIES' => {"ref" => 1},
159 'PARENT' => { TYPE => 'FUNCTION' },
162 is_deeply(GetElementLevelTable($e), [
167 POINTER_TYPE => "ref",
174 'DATA_TYPE' => 'uint8',
175 'CONTAINS_DEFERRED' => 0,
177 'IS_SURROUNDING' => 0,
181 # representation_type
185 'PROPERTIES' => { represent_as => "bar" },
188 'PARENT' => { TYPE => 'STRUCT' },
191 $ne = ParseElement($e, undef);
192 is($ne->{REPRESENTATION_TYPE}, "bar");
194 # representation_type
201 'PARENT' => { TYPE => 'STRUCT' },
204 $ne = ParseElement($e, undef);
205 is($ne->{REPRESENTATION_TYPE}, "uint8");
207 is(align_type("hyper"), 8);
208 is(align_type("uint32"), 4);
209 is(align_type("uint16"), 2);
210 is(align_type("uint8"), 1);
211 is(align_type({ TYPE => "STRUCT", "NAME" => "bla",
212 ELEMENTS => [ { TYPE => "uint16" } ] }), 4);
213 is(align_type({ TYPE => "STRUCT",
214 ELEMENTS => [ { TYPE => "hyper" } ] }), 8);
215 is(align_type({ TYPE => "TYPEDEF", DATA => {
217 ELEMENTS => [ { TYPE => "hyper" } ] }}), 8);
218 # typedef of struct without body
219 is(align_type({ TYPE => "TYPEDEF", DATA => {
220 TYPE => "STRUCT", ELEMENTS => undef }}), 4);
221 # struct without body
222 is(align_type({ TYPE => "STRUCT", ELEMENTS => undef }), 4);
224 is(align_type({ TYPE => "STRUCT", ELEMENTS => [] }), 1);
225 is(align_type({ TYPE => "STRUCT", "NAME" => "bla",
226 ELEMENTS => [ { TYPE => "uint8" } ] }), 4);
228 is(mapToScalar("someverymuchnotexistingtype"), undef);
229 is(mapToScalar("uint32"), "uint32");
230 is(mapToScalar({TYPE => "ENUM", PARENT => { PROPERTIES => { enum8bit => 1 } } }), "uint8");
231 is(mapToScalar({TYPE => "BITMAP", PROPERTIES => { bitmap64bit => 1 } }),
233 is(mapToScalar({TYPE => "TYPEDEF", DATA => {TYPE => "ENUM", PARENT => { PROPERTIES => { enum8bit => 1 } } }}), "uint8");
239 SURROUNDING_ELEMENT => undef,
248 is_deeply(ParseType($t->{ORIGINAL}, "ref"), $t);
253 SWITCH_TYPE => "uint32",
262 is_deeply(ParseType($t->{ORIGINAL}, "ref"), $t);
264 ok(not can_contain_deferred("uint32"));
265 ok(can_contain_deferred("some_unknown_type"));
266 ok(can_contain_deferred({ TYPE => "STRUCT",
267 ELEMENTS => [ { TYPE => "uint32", POINTERS => 40 } ]}));
268 ok(can_contain_deferred({ TYPE => "TYPEDEF",
269 DATA => { TYPE => "STRUCT",
270 ELEMENTS => [ { TYPE => "uint32", POINTERS => 40 } ]}}));
271 ok(not can_contain_deferred({ TYPE => "STRUCT",
272 ELEMENTS => [ { TYPE => "uint32" } ]}));
273 ok(not can_contain_deferred({ TYPE => "TYPEDEF",
274 DATA => { TYPE => "STRUCT",
275 ELEMENTS => [ { TYPE => "uint32" } ]}}));
276 ok(can_contain_deferred({ TYPE => "STRUCT",
277 ELEMENTS => [ { TYPE => "someunknowntype" } ]}));