Login
e9098167e08f44909d2acd1412fa601aa1ec102a
[gknop/Perl-Critic.git] / t / 92_memory_leaks.t
1 #!perl
2
3 ##############################################################################
4 #      $URL$
5 #     $Date$
6 #   $Author$
7 # $Revision$
8 ##############################################################################
9
10 use 5.006001;
11 use strict;
12 use warnings;
13
14 use Carp qw< confess >;
15
16 use PPI::Document;
17
18 use Perl::Critic::PolicyFactory -test => 1;
19 use Perl::Critic::Document;
20 use Perl::Critic;
21 use Perl::Critic::TestUtils qw();
22
23 use Test::More; #plan set below
24
25 #-----------------------------------------------------------------------------
26
27 our $VERSION = '1.088';
28
29 #-----------------------------------------------------------------------------
30
31 Perl::Critic::TestUtils::block_perlcriticrc();
32
33 eval 'use Test::Memory::Cycle'; ## no critic
34 plan( skip_all => 'Test::Memory::Cycle requried to test memory leaks') if $@;
35
36 #-----------------------------------------------------------------------------
37 {
38
39     # We have to create and test Perl::Critic::Document for memory leaks
40     # separately because it is not a persistent attribute of the Perl::Critic
41     # object.  The current API requires us to create the P::C::Document from
42     # an instance of an existing PPI::Document.  In the future, I hope to make
43     # that interface a little more opaque.  But this works for now.
44
45     # Coincidentally, I've discovered that PPI::Documents may or may not
46     # contain circular references, depending on the input code.  On some
47     # level, I'm sure this makes perfect sense, but I haven't stopped to think
48     # about it.  The particular input we use here does not seem to create
49     # circular references.
50
51     my $code    = q{print foo(); split /this/, $that;};
52     my $ppi_doc = PPI::Document->new( \$code );
53     my $pc_doc  = Perl::Critic::Document->new( $ppi_doc );
54     my $critic  = Perl::Critic->new( -severity => 1 );
55     my @violations = $critic->critique( $pc_doc );
56     confess "No violations were created" if not @violations;
57
58     # One test for each violation, plus one each for Critic and Document.
59     plan( tests => scalar @violations + 2 );
60
61     memory_cycle_ok( $pc_doc );
62     memory_cycle_ok( $critic );
63     memory_cycle_ok($_) for @violations;
64 }
65
66 #-----------------------------------------------------------------------------
67
68 # ensure we run true if this test is loaded by
69 # t/92_memory_leaks.t.without_optional_dependencies.t
70 1;
71
72 ###############################################################################
73 # Local Variables:
74 #   mode: cperl
75 #   cperl-indent-level: 4
76 #   fill-column: 78
77 #   indent-tabs-mode: nil
78 #   c-indentation-style: bsd
79 # End:
80 # ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :