use strict; use Test::More; use lib qw(t/lib); use NYTProfTest; use Devel::NYTProf::Constants qw(NYTP_SCi_elements); run_test_group( { extra_test_count => 8 + (3 * 6), extra_test_code => sub { my ($profile, $env) = @_; # check sub callers from sub perspective my $subs = $profile->subname_subinfo_map; my $si = $subs->{'main::foo'}; ok $si; is $si->calls, 4; my $called_by_subnames = $si->called_by_subnames; ok $called_by_subnames; is_deeply [ keys %$called_by_subnames ], [ 'main::RUNTIME' ], 'should be called from only from main::RUNTIME'; my $callers = $si->caller_fid_line_places; ok $callers; #warn Data::Dumper::Dumper($callers); # two calls from evals on same line get collapsed my @fids = keys %$callers; is @fids, 3, 'should be called from 3 files'; is_deeply [ map { keys %$_ } values %$callers ], [ 1, 1, 1 ], 'should all be called from line 1'; my @sc = map { values %$_ } values %$callers; is_deeply [ map { scalar @$_ } @sc ], [ (NYTP_SCi_elements()) x 3], 'all sub calls infos should have all elements'; # check sub callers from file perspective for my $fid (@fids) { ok my $fi = $profile->fileinfo_of($fid); ok my $sub_call_lines = $fi->sub_call_lines; #warn Data::Dumper::Dumper($sub_call_lines); is keys %$sub_call_lines, 1; is keys %{$sub_call_lines->{1}}, 1; ok my $sc = $sub_call_lines->{1}{'main::foo'}; is @$sc, NYTP_SCi_elements(), 'si should have all elements'; } }, } );