71 lines
2.3 KiB
Perl
Executable File
71 lines
2.3 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
use strict;
|
|
use warnings;
|
|
use utf8;
|
|
|
|
binmode(STDOUT, ':utf8');
|
|
binmode(STDERR, ':utf8');
|
|
|
|
# Список файлов для анализа
|
|
my @files = grep { $_ !~ /_test\.go$/ } <*.go>;
|
|
|
|
print "--- Анализ упоминаний методов в тестах (Deep Scan) ---\n";
|
|
|
|
foreach my $file (@files) {
|
|
my $test_file = $file =~ s/\.go$/_test.go/r;
|
|
|
|
unless (-e $test_file) {
|
|
print "![MISSING] Файл тестов для $file не найден\n";
|
|
next;
|
|
}
|
|
|
|
# 1. Собираем методы структуры Cli из основного файла
|
|
# Ищем: func (cli *Cli) MethodName(...)
|
|
my %methods;
|
|
open my $fh, '<:utf8', $file or next;
|
|
while (<$fh>) {
|
|
if (/func\s+\(\w+\s+\*Cli\)\s+([A-Z]\w+)\(/) {
|
|
$methods{$1} = { line => $., found => 0 };
|
|
}
|
|
}
|
|
close $fh;
|
|
|
|
next unless keys %methods;
|
|
|
|
# 2. Читаем весь тестовый файл в одну строку для глобального поиска
|
|
open my $tfh, '<:utf8', $test_file or next;
|
|
my $test_content = do { local $/; <$tfh> };
|
|
close $tfh;
|
|
|
|
# 3. Ищем упоминания методов.
|
|
# Паттерн: вызов через ресивер, например cli.UpdateAccount или c.UpdateAccount
|
|
# Но так как мы ищем просто покрытие, проверим наличие "MethodName("
|
|
foreach my $m (keys %methods) {
|
|
# Ищем паттерн: .MethodName(
|
|
if ($test_content =~ /\.$m[\(\},]/ ) {
|
|
$methods{$m}->{found} = 1;
|
|
}
|
|
}
|
|
|
|
# 4. Вывод результатов
|
|
print "\nФайл: $file (проверка в $test_file)\n";
|
|
my $missing_count = 0;
|
|
my $total = 0;
|
|
|
|
foreach my $m (sort { $methods{$a}->{line} <=> $methods{$b}->{line} } keys %methods) {
|
|
$total++;
|
|
if (!$methods{$m}->{found}) {
|
|
printf " [ ] %-30s (line %d)\n", $m, $methods{$m}->{line};
|
|
$missing_count++;
|
|
}
|
|
}
|
|
|
|
if ($missing_count == 0) {
|
|
print " [+] Покрытие 100% (все $total методов вызываются в тестах).\n";
|
|
} else {
|
|
printf " [!] Не покрыто: %d из %d методов.\n", $missing_count, $total;
|
|
}
|
|
}
|
|
|
|
exit;
|