Ancient

 view release on metacpan or  search on metacpan

t/9049-leak-object-introspection.t  view on Meta::CPAN

    plan skip_all => 'Test::LeakTrace required' if $@;
}
use Test::LeakTrace;

use object;

# Define test classes
object::define('LeakClone',
    'name:Str:required',
    'age:Int:default(0)',
    'tags:ArrayRef:default([])',
);

object::define('LeakSimple', 'foo', 'bar', 'baz');

object::define('LeakTyped',
    'str_val:Str',
    'int_val:Int:default(42)',
    'readonly_val:Str:readonly',
);

# Warmup
for (1..10) {
    my $obj = new LeakClone name => 'Warmup';
    my $clone = object::clone($obj);
    my @props = object::properties('LeakClone');
    my $info = object::slot_info('LeakClone', 'name');
}

# ==== clone() leak tests ====

subtest 'clone basic no leak' => sub {
    my $obj = new LeakClone name => 'Original', age => 30;
    no_leaks_ok {
        for (1..500) {
            my $clone = object::clone($obj);
        }
    } 'clone basic no leak';
};

subtest 'clone with array default no leak' => sub {
    my $obj = new LeakClone name => 'WithTags', age => 25;
    push @{$obj->tags}, 'tag1', 'tag2';
    no_leaks_ok {
        for (1..500) {
            my $clone = object::clone($obj);
        }
    } 'clone with array no leak';
};

subtest 'clone frozen object no leak' => sub {
    my $obj = new LeakClone name => 'Frozen', age => 40;
    object::freeze($obj);
    no_leaks_ok {
        for (1..500) {
            my $clone = object::clone($obj);
        }
    } 'clone frozen no leak';
};

subtest 'clone locked object no leak' => sub {
    my $obj = new LeakClone name => 'Locked', age => 35;
    object::lock($obj);
    no_leaks_ok {
        for (1..500) {
            my $clone = object::clone($obj);
        }
    } 'clone locked no leak';
};

subtest 'clone and modify no leak' => sub {
    my $obj = new LeakClone name => 'Source', age => 20;
    no_leaks_ok {
        for (1..500) {
            my $clone = object::clone($obj);
            $clone->name('Modified');
            $clone->age(99);
        }
    } 'clone and modify no leak';
};

# ==== properties() leak tests ====

subtest 'properties list context no leak' => sub {
    no_leaks_ok {
        for (1..1000) {
            my @props = object::properties('LeakClone');
        }
    } 'properties list no leak';
};

subtest 'properties scalar context no leak' => sub {
    no_leaks_ok {
        for (1..1000) {
            my $count = object::properties('LeakClone');
        }
    } 'properties scalar no leak';
};

subtest 'properties simple class no leak' => sub {
    no_leaks_ok {
        for (1..1000) {
            my @props = object::properties('LeakSimple');
        }
    } 'properties simple no leak';
};

subtest 'properties nonexistent class no leak' => sub {
    no_leaks_ok {
        for (1..1000) {
            my @props = object::properties('NonExistent');
            my $count = object::properties('NonExistent');
        }
    } 'properties nonexistent no leak';
};

# ==== slot_info() leak tests ====

subtest 'slot_info typed property no leak' => sub {
    no_leaks_ok {
        for (1..1000) {
            my $info = object::slot_info('LeakClone', 'name');
        }
    } 'slot_info typed no leak';
};

subtest 'slot_info with default no leak' => sub {
    no_leaks_ok {



( run in 0.646 second using v1.01-cache-2.11-cpan-4ef0a570458 )