Commit | Line | Data |
0430b7f7 |
1 | #!/usr/bin/perl -w |
e98cedbf |
2 | |
57fcdb5b |
3 | use Test::More tests => 16; |
0430b7f7 |
4 | use strict; |
6c3d85e7 |
5 | use Devel::Size qw(size total_size); |
2640cff1 |
6 | use Scalar::Util qw(weaken); |
e98cedbf |
7 | |
0430b7f7 |
8 | can_ok ('Devel::Size', qw/ |
9 | size |
10 | total_size |
11 | /); |
e98cedbf |
12 | |
5a83b7cf |
13 | die ("Uhoh, test uses an outdated version of Devel::Size") |
fe105cc1 |
14 | unless is ($Devel::Size::VERSION, '0.74_53', 'VERSION MATCHES'); |
0430b7f7 |
15 | |
16 | ############################################################################# |
17 | # some basic checks: |
e98cedbf |
18 | |
5073b933 |
19 | use vars qw($foo @foo %foo); |
20 | $foo = "12"; |
21 | @foo = (1,2,3); |
22 | %foo = (a => 1, b => 2); |
b98fcdb9 |
23 | |
24 | my $x = "A string"; |
9fc9ab86 |
25 | my $y = "A much much longer string"; # need to be at least 7 bytes longer for 64 bit |
1c566e6a |
26 | cmp_ok(size($x), '<', size($y), 'size() of strings'); |
27 | cmp_ok(total_size($x), '<', total_size($y), 'total_size() of strings'); |
b98fcdb9 |
28 | |
29 | my @x = (1..4); |
0430b7f7 |
30 | my @y = (1..200); |
31 | |
32 | my $size_1 = total_size(\@x); |
33 | my $size_2 = total_size(\@y); |
34 | |
1c566e6a |
35 | cmp_ok($size_1, '<', $size_2, 'size() of array refs'); |
0430b7f7 |
36 | |
50f7a785 |
37 | # the arrays alone shouldn't be the same size |
0430b7f7 |
38 | $size_1 = size(\@x); |
39 | $size_2 = size(\@y); |
40 | |
50f7a785 |
41 | isnt ( $size_1, $size_2, 'size() of array refs'); |
0430b7f7 |
42 | |
43 | ############################################################################# |
44 | # IV vs IV+PV (bug #17586) |
b98fcdb9 |
45 | |
0430b7f7 |
46 | $x = 12; |
47 | $y = 12; $y .= ''; |
b98fcdb9 |
48 | |
0430b7f7 |
49 | $size_1 = size($x); |
50 | $size_2 = size($y); |
b98fcdb9 |
51 | |
1c566e6a |
52 | cmp_ok($size_1, '<', $size_2, ' ."" makes string longer'); |
0430b7f7 |
53 | |
54 | ############################################################################# |
78dfb4e7 |
55 | # check that the tracking_hash is working |
56 | |
57 | my($a,$b) = (1,2); |
58 | my @ary1 = (\$a, \$a); |
59 | my @ary2 = (\$a, \$b); |
60 | |
cf1d079f |
61 | cmp_ok(total_size(\@ary1), '<', total_size(\@ary2), |
62 | 'the tracking hash is working'); |
78dfb4e7 |
63 | |
0430b7f7 |
64 | ############################################################################# |
78dfb4e7 |
65 | # check that circular references don't mess things up |
66 | |
67 | my($c1,$c2); $c2 = \$c1; $c1 = \$c2; |
68 | |
0430b7f7 |
69 | is (total_size($c1), total_size($c2), 'circular references'); |
70 | |
9fc9ab86 |
71 | ########################################################## |
72 | # RT#14849 (& RT#26781 and possibly RT#29238?) |
cf1d079f |
73 | cmp_ok( total_size( sub{ do{ my $t=0 }; } ), '>', 0, |
74 | 'total_size( sub{ my $t=0 } ) > 0' ); |
87372f42 |
75 | |
76 | # CPAN RT #58484 and #58485 |
cf1d079f |
77 | cmp_ok(total_size(\&total_size), '>', 0, 'total_size(\&total_size) > 0'); |
87372f42 |
78 | |
66f50dda |
79 | use constant LARGE => 'N' x 8192; |
87372f42 |
80 | |
66f50dda |
81 | cmp_ok (total_size(\&LARGE), '>', 8192, |
82 | 'total_size for a constant includes the constant'); |
2640cff1 |
83 | |
84 | { |
85 | my $a = []; |
86 | my $b = \$a; |
8c394e12 |
87 | # making a weakref upgrades the target to PVMG and adds magic |
88 | is(total_size($a), total_size([]), |
89 | 'Any intial reference is dereferenced and discarded'); |
2640cff1 |
90 | } |
a52ceccd |
91 | |
92 | # Must call direct - avoid all copying: |
93 | foreach(['undef', total_size(undef)], |
94 | ['no', total_size(1 == 0)], |
95 | ['yes', total_size(1 == 1)], |
96 | ) { |
97 | my ($name, $size) = @$_; |
98 | is($size, 0, |
99 | "PL_sv_$name is interpeter wide, so not counted as part of the structure's size"); |
100 | } |