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 )