--- /dev/null
+#!/usr/bin/perl -w
+
+BEGIN { unshift @INC, '.' ;
+ $SIG{__WARN__}=sub {return "" if $_[0] =~ /used only once/; print @_;};
+}
+
+use Devel::Symdump::Export qw(filehandles hashes arrays);
+use Test::More;
+
+plan tests => 13;
+
+init();
+
+my %prefices = qw(
+ scalars $
+ arrays @
+ hashes %
+ functions &
+ unknowns *
+ );
+
+@prefices{qw(filehandles dirhandles packages)}=("") x 3;
+
+
+format i_am_the_symbol_printing_format_lest_there_be_any_doubt =
+Got these @*
+ "$t:"
+~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $a
+
+.
+
+$~ = 'i_am_the_symbol_printing_format_lest_there_be_any_doubt';
+
+@a = packsort(filehandles('main'));
+$t = 'filehandles';
+$a = "@a";
+# write;
+ok (
+ $a eq "main::DATA main::Hmmmm main::STDERR main::STDIN main::STDOUT main::stderr main::stdin main::stdout"
+ ||
+ $a eq "main::ARGV main::DATA main::Hmmmm main::STDERR main::STDIN main::STDOUT main::i_am_the_symbol_printing_format_lest_there_be_any_doubt main::stderr main::stdin main::stdout",
+ $a
+ );
+
+@a = packsort(hashes 'main');
+$t = 'hashes';
+$a = uncontrol("@a");
+$a =~ s/main:://g;
+#write;
+ok (
+ $a eq "^H + - @ ENV INC SIG" # + named capture 29682
+ ||
+ $a eq "^H + @ ENV INC SIG" # + named capture 28957
+ ||
+ $a eq "^H @ ENV INC SIG" # ^H hints 27643 (?)
+ ||
+ $a eq "@ ENV INC SIG"
+ ||
+ $a eq "ENV INC SIG",
+ $a
+ );
+
+@a = packsort(arrays());
+$t = 'arrays';
+$a = "@a";
+#write;
+like (
+ $a, "/main::INC.*main::_.*main::a/"
+ );
+
+eval {
+ @a = Devel::Symdump->really_bogus('main');
+};
+$a = $@ ? $@ : "@a";
+like ($a,
+ "/^invalid Devel::Symdump method: really_bogus\(\)/",
+ );
+
+$sob = rnew Devel::Symdump;
+
+@m=();
+for (active_packages($sob)) {
+ push @m, "$_";
+}
+$a="@m";
+like ($a,
+ "/Carp.*Devel.*Devel::Symdump.*Devel::Symdump::Export.*DynaLoader.*Exporter.*Hidden.*big::long::hairy.*funny::little.*strict/");
+
+my %m=();
+for (active_modules($sob)) {
+ $m{$_}=undef;
+}
+$a = join " ", keys %m;
+#print "[$a]\n";
+ok (exists $m{"Carp"} &&
+ exists $m{"Devel::Symdump"} &&
+ exists $m{"Devel::Symdump::Export"} &&
+ exists $m{"Exporter"} &&
+ exists $m{"strict"} &&
+ exists $m{"vars"});
+
+# Cannot test on the number of packages and functions because not
+# every perl is built the same way. Static perls will reveal more
+# packages and more functions being in them
+# Testing on >= seems no problem to me, we'll see
+
+# (Time passes) Much less unknowns in version 1.22 (perl5.003_10).
+
+my %Expect=qw(
+packages 13 scalars 28 arrays 7 hashes 5 functions 35 filehandles 9
+dirhandles 2 unknowns 53
+);
+
+#we don't count the unknowns. Newer perls might have different outcomes
+for $type ( qw{
+ packages
+ scalars arrays hashes
+ functions filehandles dirhandles
+ }){
+ next unless @syms = $sob->$type();
+
+ if ($I_REALLY_WANT_A_CORE_DUMP) {
+ # if this block execute , mysteriously COREDUMPS at for() below
+ # NOT TRUE anymore (watched by Andreas, 15.6.1995)
+ @vars = ($type eq 'packages') ? sort(@syms) : packsort(@syms);
+ } else {
+ if ($type eq 'packages') {
+ @syms = sort @syms;
+ } else {
+ @syms = packsort(@syms);
+ }
+ }
+
+ ok (@syms >= $Expect{$type});
+}
+
+exit;
+
+sub active_modules {
+ my $ob = shift;
+ my @modules = ();
+ my($pack);
+ for $pack ("main", $ob->packages) {
+ if (
+ defined &{ "$pack\::import" } ||
+ defined &{ "$pack\::AUTOLOAD" } ||
+ defined @{ "$pack\::ISA" } ||
+ defined @{ "$pack\::EXPORT" } ||
+ defined @{ "$pack\::EXPORT_OK"}
+ )
+ {
+ push @modules, $pack;
+ }
+ }
+ return sort @modules;
+}
+
+sub active_packages {
+ my $ob = shift;
+
+ my @modules = ();
+ my $pack;
+ for $pack ($ob->packages) {
+ $pob = new Devel::Symdump $pack;
+ if ( $pob->scalars() ||
+ $pob->hashes() ||
+ $pob->arrays() ||
+ $pob->functions() ||
+ $pob->filehandles()||
+ $pob->dirhandles()
+ )
+ {
+ push @modules, $pack;
+ }
+ }
+ return sort @modules;
+}
+
+
+sub uncontrol {
+ local $_ = $_[0];
+ s/([\200-\377])/ 'M-' . pack('c', ord($1) & 0177 ) /eg;
+ s/([\000-\037\177])/ '^' . pack('c', ord($1) ^ 64 ) /eg;
+ return $_;
+}
+
+sub packsort {
+ my (@vars, @pax, @fullnames);
+
+ for (@_) {
+ my($pack, $name) = /^(.*::)(.*)$/s;
+ push(@vars, $name);
+ push(@pax, $pack);
+ push(@fullnames, $_);
+ }
+
+ return @fullnames [
+ sort {
+ ($pax[$a] ne 'main::') <=> ($pax[$b] ne 'main::')
+ ||
+ $pax[$a] cmp $pax[$b]
+ ||
+ $vars[$a] cmp $vars[$b]
+ } 0 .. $#fullnames
+ ];
+}
+
+
+sub init {
+ $big::long::hairy::thing++;
+ sub Devel::testsub {};
+ opendir(DOT, '.');
+ opendir(funny::little::imadir, '/');
+ $i_am_a_scalar_variable = 1;
+ open(Hmmmm, ">/dev/null");
+ open(Hidden::FH, ">/dev/null");
+}
+
+
+__END__