2 # (C) 2007 Jelmer Vernooij <jelmer@samba.org>
3 # Published under the GNU General Public License
7 use Test
::More tests
=> 47;
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, "unique", 0), [
29 'DATA_TYPE' => 'uint8',
30 'CONTAINS_DEFERRED' => 0,
32 'IS_SURROUNDING' => 0,
36 my $ne = ParseElement
($e, "unique", 0);
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, "unique", 0), [
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, "unique", 0), [
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, "unique", 0), [
136 POINTER_TYPE
=> "ref",
143 'DATA_TYPE' => 'uint8',
144 'CONTAINS_DEFERRED' => 0,
146 'IS_SURROUNDING' => 0,
150 # Case 3 : ref pointers
155 'PROPERTIES' => {"ref" => 1},
158 'PARENT' => { TYPE
=> 'STRUCT' },
161 is_deeply
(GetElementLevelTable
($e, "unique", 0), [
166 POINTER_TYPE
=> "ref",
174 POINTER_TYPE
=> "unique",
182 POINTER_TYPE
=> "unique",
189 'DATA_TYPE' => 'uint8',
190 'CONTAINS_DEFERRED' => 0,
192 'IS_SURROUNDING' => 0,
196 # Case 3 : ref pointers
201 'PROPERTIES' => {"ref" => 1},
204 'PARENT' => { TYPE
=> 'STRUCT' },
207 is_deeply
(GetElementLevelTable
($e, "ref", 0), [
212 POINTER_TYPE
=> "ref",
220 POINTER_TYPE
=> "ref",
228 POINTER_TYPE
=> "ref",
235 'DATA_TYPE' => 'uint8',
236 'CONTAINS_DEFERRED' => 0,
238 'IS_SURROUNDING' => 0,
242 # Case 4 : top-level ref pointers
247 'PROPERTIES' => {"ref" => 1},
250 'PARENT' => { TYPE
=> 'FUNCTION' },
253 is_deeply
(GetElementLevelTable
($e, "unique", 0), [
258 POINTER_TYPE
=> "ref",
265 'DATA_TYPE' => 'uint8',
266 'CONTAINS_DEFERRED' => 0,
268 'IS_SURROUNDING' => 0,
272 # Case 4 : top-level ref pointers, triple with pointer_default("unique")
277 'PROPERTIES' => {"ref" => 1},
280 'PARENT' => { TYPE
=> 'FUNCTION' },
283 is_deeply
(GetElementLevelTable
($e, "unique", 0), [
288 POINTER_TYPE
=> "ref",
296 POINTER_TYPE
=> "unique",
304 POINTER_TYPE
=> "unique",
311 'DATA_TYPE' => 'uint8',
312 'CONTAINS_DEFERRED' => 0,
314 'IS_SURROUNDING' => 0,
318 # Case 4 : top-level unique pointers, triple with pointer_default("unique")
323 'PROPERTIES' => {"unique" => 1, "in" => 1},
326 'PARENT' => { TYPE
=> 'FUNCTION' },
329 is_deeply
(GetElementLevelTable
($e, "unique", 0), [
334 POINTER_TYPE
=> "unique",
342 POINTER_TYPE
=> "unique",
350 POINTER_TYPE
=> "unique",
357 'DATA_TYPE' => 'uint8',
358 'CONTAINS_DEFERRED' => 0,
360 'IS_SURROUNDING' => 0,
364 # Case 4 : top-level unique pointers, triple with pointer_default("ref")
369 'PROPERTIES' => {"unique" => 1, "in" => 1},
372 'PARENT' => { TYPE
=> 'FUNCTION' },
375 is_deeply
(GetElementLevelTable
($e, "ref", 0), [
380 POINTER_TYPE
=> "unique",
388 POINTER_TYPE
=> "ref",
396 POINTER_TYPE
=> "ref",
403 'DATA_TYPE' => 'uint8',
404 'CONTAINS_DEFERRED' => 0,
406 'IS_SURROUNDING' => 0,
410 # Case 4 : top-level ref pointers, triple with pointer_default("ref")
415 'PROPERTIES' => {"ref" => 1},
418 'PARENT' => { TYPE
=> 'FUNCTION' },
421 is_deeply
(GetElementLevelTable
($e, "ref", 0), [
426 POINTER_TYPE
=> "ref",
434 POINTER_TYPE
=> "ref",
442 POINTER_TYPE
=> "ref",
449 'DATA_TYPE' => 'uint8',
450 'CONTAINS_DEFERRED' => 0,
452 'IS_SURROUNDING' => 0,
456 # representation_type
460 'PROPERTIES' => { represent_as
=> "bar" },
463 'PARENT' => { TYPE
=> 'STRUCT' },
466 $ne = ParseElement
($e, undef, 0);
467 is
($ne->{REPRESENTATION_TYPE
}, "bar");
469 # representation_type
476 'PARENT' => { TYPE
=> 'STRUCT' },
479 $ne = ParseElement
($e, undef, 0);
480 is
($ne->{REPRESENTATION_TYPE
}, "uint8");
482 is
(align_type
("hyper"), 8);
483 is
(align_type
("double"), 8);
484 is
(align_type
("uint32"), 4);
485 is
(align_type
("uint16"), 2);
486 is
(align_type
("uint8"), 1);
487 is
(align_type
({ TYPE
=> "STRUCT", "NAME" => "bla",
488 ELEMENTS
=> [ { TYPE
=> "uint16" } ] }), 4);
489 is
(align_type
({ TYPE
=> "STRUCT",
490 ELEMENTS
=> [ { TYPE
=> "hyper" } ] }), 8);
491 is
(align_type
({ TYPE
=> "TYPEDEF", DATA
=> {
493 ELEMENTS
=> [ { TYPE
=> "hyper" } ] }}), 8);
494 # typedef of struct without body
495 is
(align_type
({ TYPE
=> "TYPEDEF", DATA
=> {
496 TYPE
=> "STRUCT", ELEMENTS
=> undef }}), 4);
497 # struct without body
498 is
(align_type
({ TYPE
=> "STRUCT", ELEMENTS
=> undef }), 4);
500 is
(align_type
({ TYPE
=> "STRUCT", ELEMENTS
=> [] }), 1);
501 is
(align_type
({ TYPE
=> "STRUCT", "NAME" => "bla",
502 ELEMENTS
=> [ { TYPE
=> "uint8" } ] }), 4);
504 is
(mapToScalar
("someverymuchnotexistingtype"), undef);
505 is
(mapToScalar
("uint32"), "uint32");
506 is
(mapToScalar
({TYPE
=> "ENUM", PARENT
=> { PROPERTIES
=> { enum8bit
=> 1 } } }), "uint8");
507 is
(mapToScalar
({TYPE
=> "BITMAP", PROPERTIES
=> { bitmap64bit
=> 1 } }),
509 is
(mapToScalar
({TYPE
=> "TYPEDEF", DATA
=> {TYPE
=> "ENUM", PARENT
=> { PROPERTIES
=> { enum8bit
=> 1 } } }}), "uint8");
515 SURROUNDING_ELEMENT
=> undef,
524 is_deeply
(ParseType
($t->{ORIGINAL
}, "ref", 0), $t);
529 SWITCH_TYPE
=> "uint32",
540 is_deeply
(ParseType
($t->{ORIGINAL
}, "ref", 0), $t);
542 ok
(not can_contain_deferred
("uint32"));
543 ok
(can_contain_deferred
("some_unknown_type"));
544 ok
(can_contain_deferred
({ TYPE
=> "STRUCT",
545 ELEMENTS
=> [ { TYPE
=> "uint32", POINTERS
=> 40 } ]}));
546 ok
(can_contain_deferred
({ TYPE
=> "TYPEDEF",
547 DATA
=> { TYPE
=> "STRUCT",
548 ELEMENTS
=> [ { TYPE
=> "uint32", POINTERS
=> 40 } ]}}));
549 ok
(not can_contain_deferred
({ TYPE
=> "STRUCT",
550 ELEMENTS
=> [ { TYPE
=> "uint32" } ]}));
551 ok
(not can_contain_deferred
({ TYPE
=> "TYPEDEF",
552 DATA
=> { TYPE
=> "STRUCT",
553 ELEMENTS
=> [ { TYPE
=> "uint32" } ]}}));
554 ok
(can_contain_deferred
({ TYPE
=> "STRUCT",
555 ELEMENTS
=> [ { TYPE
=> "someunknowntype" } ]}));
556 # Make sure the elements for a enum without body aren't filled in
557 ok
(not defined(ParseType
({TYPE
=> "ENUM", NAME
=> "foo" }, "ref", 0)->{ELEMENTS
}));
558 # Make sure the elements for a bitmap without body aren't filled in
559 ok
(not defined(ParseType
({TYPE
=> "BITMAP", NAME
=> "foo" }, "ref", 0)->{ELEMENTS
}));
560 # Make sure the elements for a union without body aren't filled in
561 ok
(not defined(ParseType
({TYPE
=> "UNION", NAME
=> "foo" }, "ref", 0)->{ELEMENTS
}));