Mercurial > repos > cpt > cpt_psm_prep
diff lib/CPT/GenerateTests.pm @ 1:d724f34e671d draft default tip
planemo upload commit 94b0cd1fff0826c6db3e7dc0c91c0c5a8be8bb0c
author | cpt |
---|---|
date | Mon, 05 Jun 2023 02:50:07 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/CPT/GenerateTests.pm Mon Jun 05 02:50:07 2023 +0000 @@ -0,0 +1,151 @@ +package CPT::GenerateTests; +use Moose; +use strict; +use warnings; +use autodie; + + +sub gen { + my ( $self, @tests ) = @_; + + my $test_count = 0; + + # Header + my @outtext = ( + '#!/usr/bin/env perl', + 'use strict;', + 'use warnings;', + 'use Test::More tests => 0;', + 'use IPC::Run3 qw(run3);', + '', + 'my ( @base, @cmd, $in, $out, $err );', + '', + sprintf("%s = ('perl', '%s');", '@base', $0), + 'my %result_files = (', + ); + my %test_names; + # Loop across tests + foreach my $test_ref(@tests){ + my %test = %{$test_ref}; + my %params = %{$test{params}}; + my $command_line = ""; + foreach(sort(keys(%params))){ + $command_line .= "--$_ $params{$_} "; + } + my %outputs = %{$test{outputs}}; + + $test_names{$test{test_name}}++; + if($test_names{$test{test_name}} > 1){ + printf STDERR "Duplicate test found: %s. This will cause fewer tests to be run than expected\n", $test{test_name}; + } + push(@outtext, sprintf(' "%s" => {', $test{test_name})); + push(@outtext, sprintf(' command_line => "%s",', $command_line)); + push(@outtext, ' outputs => {'); + + foreach my $key(keys %outputs){ + push(@outtext, sprintf(' "%s" => ["%s", "%s"],', $key, @{$outputs{$key}})); + # Add another test + $test_count++; + $test_count++; + } + push(@outtext, ' },'); + push(@outtext, ' },'); + }; + push(@outtext, ');'); + push(@outtext,''); + + push(@outtext, 'foreach ( keys(%result_files) ) {'); + push(@outtext, ' # run with the command line'); + push(@outtext, ' my @cmd1 = ( @base, split( / /, $result_files{$_}{command_line} ) );'); + push(@outtext, ' run3 \@cmd1, \$in, \$out, \$err;'); + push(@outtext, ' if($err){ print STDERR "Exec STDERR: $err"; }'); + push(@outtext, ' if($out){ print STDERR "Exec STDOUT $out"; }'); + push(@outtext, ' # and now compare files'); + push(@outtext, ' foreach my $file_cmp ( keys( %{$result_files{$_}{outputs}} ) ) {'); + push(@outtext, ' my ($gen, $static) = @{$result_files{$_}{outputs}{$file_cmp}};'); + push(@outtext, ' my @diff = ( "diff", $gen, $static );'); + push(@outtext, ' my ($in_g, $out_g, $err_g);'); + push(@outtext, ' run3 \@diff, \$in_g, \$out_g, \$err_g;'); + push(@outtext, ' if($err_g) { print STDERR "err_g $err_g\n"; }'); + push(@outtext, ' if($out_g) { print STDOUT "out_g $out_g\n"; }'); + push(@outtext, ' chomp $out_g;'); + push(@outtext, ' is( -e $gen, 1, "[$_] Output file must exist"); '); + push(@outtext, ' is( length($out_g), 0, "[$_] Checking validity of output \'$file_cmp\'" );'); + push(@outtext, ' unlink $gen;'); + push(@outtext, ' }'); + push(@outtext, '}'); + + # Update test counts + $outtext[3] = "use Test::More tests => $test_count;"; + if($test_count == 0){ + return $self->gen_empty(); + } + + return join("\n", @outtext); +} + +sub gen_empty { + my ( $self ) = @_; + + my $test_count = 0; + + my @outtext = ( + '#!/usr/bin/env perl', + 'use strict;', + 'use warnings;', + 'use Test::More skip_all => "No tests defined for ' . $0 .'"', + ); + return join("\n", @outtext); +} + + +no Moose; +1; + +__END__ + +=pod + +=encoding UTF-8 + +=head1 NAME + +CPT::GenerateTests + +=head1 VERSION + +version 1.99.4 + +=head2 gen + + require CPT::GenerateTests; + my $tgen = CPT::GenerateTests->new(); + $tgen->gen( + { + test_name => "Default", + params => { + 'file' => 't/test-files/aa.gbk', + 'chromosome' => 'test', + 'color' => 'red', + 'intensity' => 'vvvvl', + }, + outputs => { + 'result_name' => ['circos_k.txt', 'test-data/circos_k.txt'], + } + }, + ); + exit 1; + +=head1 AUTHOR + +Eric Rasche <rasche.eric@yandex.ru> + +=head1 COPYRIGHT AND LICENSE + +This software is Copyright (c) 2014 by Eric Rasche. + +This is free software, licensed under: + + The GNU General Public License, Version 3, June 2007 + +=cut