mirror of
https://github.com/samba-team/samba.git
synced 2025-08-29 13:49:30 +03:00
r21427: Add tests for Needed*(), in preparation of refactoring.
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
8b31fba826
commit
a21e7b22ac
@ -11,7 +11,8 @@ require Exporter;
|
|||||||
@ISA = qw(Exporter);
|
@ISA = qw(Exporter);
|
||||||
@EXPORT = qw(is_charset_array);
|
@EXPORT = qw(is_charset_array);
|
||||||
@EXPORT_OK = qw(check_null_pointer GenerateFunctionInEnv
|
@EXPORT_OK = qw(check_null_pointer GenerateFunctionInEnv
|
||||||
GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv);
|
GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv NeededFunction
|
||||||
|
NeededElement NeededTypedef);
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use Parse::Pidl::Typelist qw(hasType getType mapType);
|
use Parse::Pidl::Typelist qw(hasType getType mapType);
|
||||||
@ -2483,6 +2484,14 @@ sub Parse($$$)
|
|||||||
return ($res_hdr, $res);
|
return ($res_hdr, $res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub NeededElement($$$)
|
||||||
|
{
|
||||||
|
my ($e, $dir, $needed) = @_;
|
||||||
|
|
||||||
|
return if (defined($needed->{"$dir\_$e->{TYPE}"}));
|
||||||
|
$needed->{"$dir\_$e->{TYPE}"} = 1;
|
||||||
|
}
|
||||||
|
|
||||||
sub NeededFunction($$)
|
sub NeededFunction($$)
|
||||||
{
|
{
|
||||||
my ($fn,$needed) = @_;
|
my ($fn,$needed) = @_;
|
||||||
@ -2491,15 +2500,7 @@ sub NeededFunction($$)
|
|||||||
$needed->{"print_$fn->{NAME}"} = 1;
|
$needed->{"print_$fn->{NAME}"} = 1;
|
||||||
foreach my $e (@{$fn->{ELEMENTS}}) {
|
foreach my $e (@{$fn->{ELEMENTS}}) {
|
||||||
$e->{PARENT} = $fn;
|
$e->{PARENT} = $fn;
|
||||||
unless(defined($needed->{"pull_$e->{TYPE}"})) {
|
NeededElement($e, $_, $needed) foreach ("pull", "push", "print");
|
||||||
$needed->{"pull_$e->{TYPE}"} = 1;
|
|
||||||
}
|
|
||||||
unless(defined($needed->{"push_$e->{TYPE}"})) {
|
|
||||||
$needed->{"push_$e->{TYPE}"} = 1;
|
|
||||||
}
|
|
||||||
unless(defined($needed->{"print_$e->{TYPE}"})) {
|
|
||||||
$needed->{"print_$e->{TYPE}"} = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2522,18 +2523,9 @@ sub NeededTypedef($$)
|
|||||||
if (has_property($e, "compression")) {
|
if (has_property($e, "compression")) {
|
||||||
$needed->{"compression"} = 1;
|
$needed->{"compression"} = 1;
|
||||||
}
|
}
|
||||||
if ($needed->{"pull_$t->{NAME}"} and
|
NeededElement($e, "pull", $needed) if ($needed->{"pull_$t->{NAME}"});
|
||||||
not defined($needed->{"pull_$e->{TYPE}"})) {
|
NeededElement($e, "push", $needed) if ($needed->{"push_$t->{NAME}"});
|
||||||
$needed->{"pull_$e->{TYPE}"} = 1;
|
NeededElement($e, "print", $needed) if ($needed->{"print_$t->{NAME}"});
|
||||||
}
|
|
||||||
if ($needed->{"push_$t->{NAME}"} and
|
|
||||||
not defined($needed->{"push_$e->{TYPE}"})) {
|
|
||||||
$needed->{"push_$e->{TYPE}"} = 1;
|
|
||||||
}
|
|
||||||
if ($needed->{"print_$t->{NAME}"} and
|
|
||||||
not defined($needed->{"print_$e->{TYPE}"})) {
|
|
||||||
$needed->{"print_$e->{TYPE}"} = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,12 +4,14 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
use Test::More tests => 20;
|
use Test::More tests => 29;
|
||||||
use FindBin qw($RealBin);
|
use FindBin qw($RealBin);
|
||||||
use lib "$RealBin";
|
use lib "$RealBin";
|
||||||
use Util;
|
use Util;
|
||||||
use Parse::Pidl::Util qw(MyDumper);
|
use Parse::Pidl::Util qw(MyDumper);
|
||||||
use Parse::Pidl::Samba4::NDR::Parser qw(check_null_pointer GenerateFunctionInEnv GenerateFunctionOutEnv GenerateStructEnv EnvSubstituteValue);
|
use Parse::Pidl::Samba4::NDR::Parser qw(check_null_pointer
|
||||||
|
GenerateFunctionInEnv GenerateFunctionOutEnv GenerateStructEnv
|
||||||
|
EnvSubstituteValue NeededFunction NeededElement NeededTypedef);
|
||||||
|
|
||||||
my $output;
|
my $output;
|
||||||
sub print_fn($) { my $x = shift; $output.=$x; }
|
sub print_fn($) { my $x = shift; $output.=$x; }
|
||||||
@ -172,3 +174,57 @@ $fn = { ELEMENTS => [ { NAME => "foo", PROPERTIES => { value => 0 }} ] };
|
|||||||
$env = GenerateStructEnv($fn);
|
$env = GenerateStructEnv($fn);
|
||||||
EnvSubstituteValue($env, $fn);
|
EnvSubstituteValue($env, $fn);
|
||||||
is_deeply($env, { foo => 0, this => "r" });
|
is_deeply($env, { foo => 0, this => "r" });
|
||||||
|
|
||||||
|
my $needed = {};
|
||||||
|
NeededElement({ TYPE => "foo" }, "pull", $needed);
|
||||||
|
is_deeply($needed, { pull_foo => 1 });
|
||||||
|
|
||||||
|
# old settings should be kept
|
||||||
|
$needed = { pull_foo => 0 };
|
||||||
|
NeededElement({ TYPE => "foo" }, "pull", $needed);
|
||||||
|
is_deeply($needed, { pull_foo => 0 });
|
||||||
|
|
||||||
|
# print/pull/push are independent of each other
|
||||||
|
$needed = { pull_foo => 0 };
|
||||||
|
NeededElement({ TYPE => "foo" }, "print", $needed);
|
||||||
|
is_deeply($needed, { pull_foo => 0, print_foo => 1 });
|
||||||
|
|
||||||
|
$needed = { };
|
||||||
|
NeededFunction({ NAME => "foo", ELEMENTS => [ { TYPE => "bar" } ] }, $needed);
|
||||||
|
is_deeply($needed, { pull_foo => 1, print_foo => 1, push_foo => 1,
|
||||||
|
pull_bar => 1, print_bar => 1, push_bar => 1});
|
||||||
|
|
||||||
|
# push/pull/print are always set for functions
|
||||||
|
$needed = { pull_foo => 0 };
|
||||||
|
NeededFunction({ NAME => "foo", ELEMENTS => [ { TYPE => "bar" } ] }, $needed);
|
||||||
|
is_deeply($needed, { pull_foo => 1, print_foo => 1, push_foo => 1,
|
||||||
|
pull_bar => 1, push_bar => 1, print_bar => 1});
|
||||||
|
|
||||||
|
# public structs are always needed
|
||||||
|
$needed = {};
|
||||||
|
NeededTypedef({ NAME => "bla", DATA => { TYPE => "STRUCT", ELEMENTS => [] } },
|
||||||
|
$needed);
|
||||||
|
is_deeply($needed, { });
|
||||||
|
|
||||||
|
$needed = {};
|
||||||
|
NeededTypedef({ PROPERTIES => { public => 1 }, NAME => "bla",
|
||||||
|
DATA => { TYPE => "STRUCT", ELEMENTS => [] } },
|
||||||
|
$needed);
|
||||||
|
is_deeply($needed, { pull_bla => 1, print_bla => 1, push_bla => 1 });
|
||||||
|
|
||||||
|
# make sure types for elements are set too
|
||||||
|
$needed = {};
|
||||||
|
NeededTypedef({ PROPERTIES => { public => 1 }, NAME => "bla",
|
||||||
|
DATA => { TYPE => "STRUCT",
|
||||||
|
ELEMENTS => [ { TYPE => "bar" } ] } },
|
||||||
|
$needed);
|
||||||
|
is_deeply($needed, { pull_bla => 1, print_bla => 1, push_bla => 1,
|
||||||
|
pull_bar => 1, print_bar => 1, push_bar => 1});
|
||||||
|
|
||||||
|
$needed = {};
|
||||||
|
NeededTypedef({ PROPERTIES => { gensize => 1}, NAME => "bla",
|
||||||
|
DATA => { TYPE => "STRUCT",
|
||||||
|
ELEMENTS => [ { TYPE => "bar" } ] } },
|
||||||
|
$needed);
|
||||||
|
is_deeply($needed, { ndr_size_bla => 1 });
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user