From d2b55565cb3bbafd9923c9b67e021bcf09c7eaa7 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 14 Nov 2010 13:25:57 -0600 Subject: implement get_all_symbols --- t/01-basic.t | 46 ++++++++++++++++++++++++++++++++++++++++++++++ t/20-leaks.t | 16 ++++++++++++++++ 2 files changed, 62 insertions(+) (limited to 't') diff --git a/t/01-basic.t b/t/01-basic.t index 4c4a7c9..6b85515 100644 --- a/t/01-basic.t +++ b/t/01-basic.t @@ -226,6 +226,52 @@ is($foo_stash->get_symbol('@foo'), $ARRAY, '... got the right values for @Foo::f ok(defined(*{"Foo::foo"}{ARRAY}), '... the @foo slot has NOT been removed'); } +{ + my $syms = $foo_stash->get_all_symbols; + is_deeply( + [ sort keys %{ $syms } ], + [ sort $foo_stash->list_all_symbols ], + '... the fetched symbols are the same as the listed ones' + ); +} + +{ + my $syms = $foo_stash->get_all_symbols('CODE'); + + is_deeply( + [ sort keys %{ $syms } ], + [ sort $foo_stash->list_all_symbols('CODE') ], + '... the fetched symbols are the same as the listed ones' + ); + + foreach my $symbol (keys %{ $syms }) { + is($syms->{$symbol}, $foo_stash->get_symbol('&' . $symbol), '... got the right symbol'); + } +} + +{ + $foo_stash->add_symbol('%zork'); + + my $syms = $foo_stash->get_all_symbols('HASH'); + + is_deeply( + [ sort keys %{ $syms } ], + [ sort $foo_stash->list_all_symbols('HASH') ], + '... the fetched symbols are the same as the listed ones' + ); + + foreach my $symbol (keys %{ $syms }) { + is($syms->{$symbol}, $foo_stash->get_symbol('%' . $symbol), '... got the right symbol'); + } + + no warnings 'once'; + is_deeply( + $syms, + { zork => \%Foo::zork }, + "got the right ones", + ); +} + # check some errors like(exception { diff --git a/t/20-leaks.t b/t/20-leaks.t index 3954b15..d5dae8a 100644 --- a/t/20-leaks.t +++ b/t/20-leaks.t @@ -143,6 +143,22 @@ use Symbol; } "list_all_symbols doesn't leak"; } +{ + package Blah; + use constant 'baz'; +} + +{ + my $foo = Package::Stash->new('Foo'); + my $blah = Package::Stash->new('Blah'); + no_leaks_ok { + $foo->get_all_symbols; + $foo->get_all_symbols('SCALAR'); + $foo->get_all_symbols('CODE'); + $blah->get_all_symbols('CODE'); + } "list_all_symbols doesn't leak"; +} + # mimic CMOP::create_anon_class { local $TODO = $] < 5.010 ? "deleting stashes is inherently leaky on 5.8" -- cgit v1.2.3-54-g00ecf