Claude-Agent-Code-Refactor

 view release on metacpan or  search on metacpan

t/01-basic.t  view on Meta::CPAN

#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use Test::Exception;

use_ok('Claude::Agent::Code::Refactor');
use_ok('Claude::Agent::Code::Refactor::Options');
use_ok('Claude::Agent::Code::Refactor::Result');

# Test exports
can_ok('Claude::Agent::Code::Refactor', qw(refactor refactor_issues refactor_until_clean));

# Test Options
subtest 'Options defaults' => sub {
    my $opts = Claude::Agent::Code::Refactor::Options->new();

    is($opts->max_iterations, 5, 'default max_iterations');
    is($opts->max_turns_per_fix, 20, 'default max_turns_per_fix');
    is($opts->stop_on_critical, 1, 'default stop_on_critical');
    is($opts->min_severity, 'low', 'default min_severity');
    is_deeply($opts->categories,
        ['bugs', 'security', 'style', 'performance', 'maintainability'],
        'default categories');
    is($opts->fix_one_at_a_time, 0, 'default fix_one_at_a_time');
    is($opts->dry_run, 0, 'default dry_run');
    is($opts->create_backup, 0, 'default create_backup');
    is($opts->perlcritic, 0, 'default perlcritic');
    is($opts->perlcritic_severity, 4, 'default perlcritic_severity');
    is($opts->filter_false_positives, 1, 'default filter_false_positives');
    is($opts->permission_mode, 'acceptEdits', 'default permission_mode');
};

subtest 'Options custom values' => sub {
    my $opts = Claude::Agent::Code::Refactor::Options->new(
        max_iterations     => 10,
        max_turns_per_fix  => 30,
        min_severity       => 'medium',
        categories         => ['bugs', 'security'],
        dry_run            => 1,
        perlcritic         => 1,
        perlcritic_severity => 2,
        model              => 'claude-sonnet-4-5',
    );

    is($opts->max_iterations, 10, 'custom max_iterations');
    is($opts->max_turns_per_fix, 30, 'custom max_turns_per_fix');
    is($opts->min_severity, 'medium', 'custom min_severity');
    is_deeply($opts->categories, ['bugs', 'security'], 'custom categories');
    is($opts->dry_run, 1, 'custom dry_run');
    is($opts->perlcritic, 1, 'custom perlcritic');
    is($opts->perlcritic_severity, 2, 'custom perlcritic_severity');
    is($opts->model, 'claude-sonnet-4-5', 'custom model');
};

subtest 'Options validation' => sub {
    throws_ok {
        Claude::Agent::Code::Refactor::Options->new(min_severity => 'invalid');
    } qr/Invalid min_severity/, 'rejects invalid min_severity';

    throws_ok {
        Claude::Agent::Code::Refactor::Options->new(categories => ['invalid']);
    } qr/Invalid category/, 'rejects invalid category';

    throws_ok {
        Claude::Agent::Code::Refactor::Options->new(categories => []);
    } qr/cannot be empty/, 'rejects empty categories';

    throws_ok {
        Claude::Agent::Code::Refactor::Options->new(max_iterations => 0);
    } qr/must be >= 1/, 'rejects zero max_iterations';

    throws_ok {
        Claude::Agent::Code::Refactor::Options->new(max_turns_per_fix => 0);
    } qr/must be >= 1/, 'rejects zero max_turns_per_fix';

    throws_ok {
        Claude::Agent::Code::Refactor::Options->new(perlcritic_severity => 6);
    } qr/Invalid perlcritic_severity/, 'rejects invalid perlcritic_severity';
};

# Test Result
subtest 'Result defaults' => sub {
    my $result = Claude::Agent::Code::Refactor::Result->new();

    is($result->success, 0, 'default success');
    is($result->iterations, 0, 'default iterations');



( run in 2.961 seconds using v1.01-cache-2.11-cpan-df04353d9ac )