summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/pidl/lib/Parse/Pidl/NDR.pm3
-rw-r--r--source4/pidl/lib/Parse/Pidl/Util.pm2
-rwxr-xr-xsource4/pidl/tests/ndr.pl154
3 files changed, 157 insertions, 2 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/NDR.pm b/source4/pidl/lib/Parse/Pidl/NDR.pm
index f8cae5665f..462e577cdd 100644
--- a/source4/pidl/lib/Parse/Pidl/NDR.pm
+++ b/source4/pidl/lib/Parse/Pidl/NDR.pm
@@ -35,6 +35,7 @@ use vars qw($VERSION);
$VERSION = '0.01';
@ISA = qw(Exporter);
@EXPORT = qw(GetPrevLevel GetNextLevel ContainsDeferred ContainsString);
+@EXPORT_OK = qw(GetElementLevelTable ParseElement);
use strict;
use Parse::Pidl qw(warning fatal);
@@ -837,7 +838,7 @@ sub ValidProperties($$)
return unless defined $e->{PROPERTIES};
foreach my $key (keys %{$e->{PROPERTIES}}) {
- fatal($e, el_name($e) . ": unknown property '$key'")
+ warning($e, el_name($e) . ": unknown property '$key'")
unless defined($property_list{$key});
fatal($e, el_name($e) . ": property '$key' not allowed on '$t'")
diff --git a/source4/pidl/lib/Parse/Pidl/Util.pm b/source4/pidl/lib/Parse/Pidl/Util.pm
index 11e738fd13..35338492dd 100644
--- a/source4/pidl/lib/Parse/Pidl/Util.pm
+++ b/source4/pidl/lib/Parse/Pidl/Util.pm
@@ -6,7 +6,7 @@ package Parse::Pidl::Util;
require Exporter;
@ISA = qw(Exporter);
-@EXPORT = qw(has_property property_matches ParseExpr is_constant make_str print_uuid);
+@EXPORT = qw(has_property property_matches ParseExpr is_constant make_str print_uuid MyDumper);
use vars qw($VERSION);
$VERSION = '0.01';
diff --git a/source4/pidl/tests/ndr.pl b/source4/pidl/tests/ndr.pl
new file mode 100755
index 0000000000..97199a4120
--- /dev/null
+++ b/source4/pidl/tests/ndr.pl
@@ -0,0 +1,154 @@
+#!/usr/bin/perl
+# (C) 2007 Jelmer Vernooij <jelmer@samba.org>
+# Published under the GNU General Public License
+use strict;
+use warnings;
+
+use Test::More tests => 9;
+use FindBin qw($RealBin);
+use lib "$RealBin";
+use Util;
+use Parse::Pidl::Util qw(MyDumper);
+use Parse::Pidl::NDR qw(GetElementLevelTable ParseElement);
+
+# Case 1
+
+my $e = {
+ 'FILE' => 'foo.idl',
+ 'NAME' => 'v',
+ 'PROPERTIES' => {},
+ 'POINTERS' => 0,
+ 'TYPE' => 'uint8',
+ 'LINE' => 42 };
+
+is_deeply(GetElementLevelTable($e), [
+ {
+ 'IS_DEFERRED' => 0,
+ 'LEVEL_INDEX' => 0,
+ 'DATA_TYPE' => 'uint8',
+ 'CONVERT_FROM' => undef,
+ 'CONTAINS_DEFERRED' => 0,
+ 'TYPE' => 'DATA',
+ 'IS_SURROUNDING' => 0,
+ 'CONVERT_TO' => undef
+ }
+]);
+
+my $ne = ParseElement($e);
+is($ne->{ORIGINAL}, $e);
+is($ne->{NAME}, "v");
+is($ne->{ALIGN}, 1);
+is($ne->{TYPE}, "uint8");
+is_deeply($ne->{LEVELS}, [
+ {
+ 'IS_DEFERRED' => 0,
+ 'LEVEL_INDEX' => 0,
+ 'DATA_TYPE' => 'uint8',
+ 'CONVERT_FROM' => undef,
+ 'CONTAINS_DEFERRED' => 0,
+ 'TYPE' => 'DATA',
+ 'IS_SURROUNDING' => 0,
+ 'CONVERT_TO' => undef
+ }
+]);
+
+# Case 2 : pointers
+#
+$e = {
+ 'FILE' => 'foo.idl',
+ 'NAME' => 'v',
+ 'PROPERTIES' => {},
+ 'POINTERS' => 1,
+ 'TYPE' => 'uint8',
+ 'LINE' => 42 };
+
+is_deeply(GetElementLevelTable($e), [
+ {
+ LEVEL_INDEX => 0,
+ IS_DEFERRED => 0,
+ TYPE => 'POINTER',
+ POINTER_TYPE => undef,
+ POINTER_INDEX => 0,
+ LEVEL => 'EMBEDDED'
+ },
+ {
+ 'IS_DEFERRED' => 1,
+ 'LEVEL_INDEX' => 1,
+ 'DATA_TYPE' => 'uint8',
+ 'CONVERT_FROM' => undef,
+ 'CONTAINS_DEFERRED' => 0,
+ 'TYPE' => 'DATA',
+ 'IS_SURROUNDING' => 0,
+ 'CONVERT_TO' => undef
+ }
+]);
+
+# Case 3 : double pointers
+#
+$e = {
+ 'FILE' => 'foo.idl',
+ 'NAME' => 'v',
+ 'PROPERTIES' => {},
+ 'POINTERS' => 2,
+ 'TYPE' => 'uint8',
+ 'LINE' => 42 };
+
+is_deeply(GetElementLevelTable($e), [
+ {
+ LEVEL_INDEX => 0,
+ IS_DEFERRED => 0,
+ TYPE => 'POINTER',
+ POINTER_TYPE => undef,
+ POINTER_INDEX => 0,
+ LEVEL => 'EMBEDDED'
+ },
+ {
+ LEVEL_INDEX => 1,
+ IS_DEFERRED => 1,
+ TYPE => 'POINTER',
+ POINTER_TYPE => undef,
+ POINTER_INDEX => 1,
+ LEVEL => 'EMBEDDED'
+ },
+ {
+ 'IS_DEFERRED' => 1,
+ 'LEVEL_INDEX' => 2,
+ 'DATA_TYPE' => 'uint8',
+ 'CONVERT_FROM' => undef,
+ 'CONTAINS_DEFERRED' => 0,
+ 'TYPE' => 'DATA',
+ 'IS_SURROUNDING' => 0,
+ 'CONVERT_TO' => undef
+ }
+]);
+
+# Case 2 : ref pointers
+#
+$e = {
+ 'FILE' => 'foo.idl',
+ 'NAME' => 'v',
+ 'PROPERTIES' => {"ref" => 1},
+ 'POINTERS' => 1,
+ 'TYPE' => 'uint8',
+ 'LINE' => 42 };
+
+is_deeply(GetElementLevelTable($e), [
+ {
+ LEVEL_INDEX => 0,
+ IS_DEFERRED => 0,
+ TYPE => 'POINTER',
+ POINTER_TYPE => "ref",
+ POINTER_INDEX => 0,
+ LEVEL => 'EMBEDDED'
+ },
+ {
+ 'IS_DEFERRED' => 1,
+ 'LEVEL_INDEX' => 1,
+ 'DATA_TYPE' => 'uint8',
+ 'CONVERT_FROM' => undef,
+ 'CONTAINS_DEFERRED' => 0,
+ 'TYPE' => 'DATA',
+ 'IS_SURROUNDING' => 0,
+ 'CONVERT_TO' => undef
+ }
+]);