X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fscripts%2Flyx_batch.pl.in;h=25626ea3956158b265c6beebbef428902fc7c2fe;hb=975f304185eca53d62de8b36e6fc5f95b2da4fd9;hp=22395442b0808b7c47b5f0b0fe0b8585632cea9d;hpb=26eeaa1af245f8fff3119404adae8627821a251a;p=features.git diff --git a/lib/scripts/lyx_batch.pl.in b/lib/scripts/lyx_batch.pl.in old mode 100755 new mode 100644 index 22395442b0..25626ea395 --- a/lib/scripts/lyx_batch.pl.in +++ b/lib/scripts/lyx_batch.pl.in @@ -7,76 +7,175 @@ use strict; use warnings; use File::Copy; use File::Compare; +use File::Slurp qw(read_dir read_file); -sub check_precondition(); +sub checkPrecondition(); sub system1(@); +sub addFiles($$$); +sub mycompare($$$$); my $builddir = "@CMAKE_BINARY_DIR@"; -my $userdir = "$builddir/Testing/.lyx"; +my $userdir = "$builddir/Testing/.lyxbatch"; my $workdir = "$builddir/autotests/out-home"; my $vsuffix = "@PROGRAM_SUFFIX@"; my $lyx_exe = "$builddir/bin/lyx$vsuffix"; my $git_exe = "@LYX_GITVERSION@"; +my $qt_version = "@LYX_USE_QT@"; my $lyxsource = "@LYX_ABS_TOP_SRCDIR@"; my $data = "$lyxsource/development/batchtests"; +my $test_bin = "$lyxsource/development/batchtests/bin"; +my $comparepdf = "@COMPAREPDF_EXECUTABLE@"; +my $perl = "@PERL_EXECUTABLE@"; +# src_files := Files to be copied from lyx-source to build-dir +# check := List of pairs of files to check +# created file (in build-dir) +# expected file (in source dir, to be compared with the created one) +# check_type: Type of check to perform, can be either: +# * text (default) - compares using File::Compare (i.e. full comparison) +# * pdf - compares using comparepdf (must be installed) +# * custom - compares using a custom script +# check_script: For check_type==custom, this is the script that's executed to do the comparison +# commands := List of commands (lyx-functions) to be executed by lyx in a batch +# precondition: system commands to be executed prior to the test +# command_line: List of parameters to be used on the lyx-command-line my %Tests = ( + save_as_test => { + src_files => ["save_as.lyx"], + check => [["save_as_saved.lyx"], + ["save_as_saved2.lyx"]], + commands => ["file-open beamer_test.lyx", + "buffer-write-as save_as_saved.lyx", + "buffer-reload dump", + "buffer-write-as save_as_saved2.lyx", + "lyx-quit"], + }, beamer_test => { - create => "beamer_test.tex", + src_files => ["beamer_test.lyx"], + check => [["beamer_test.tex", "beamer_test.tex.orig"]], commands => ["file-open beamer_test.lyx", - "buffer-begin", - "repeat 150 outline-down", - "repeat 150 outline-up", - "buffer-export pdflatex", - "repeat 150 outline-down", - "buffer-reload dump", - "lyx-quit"] + "buffer-begin", + "repeat 150 outline-down", + "repeat 150 outline-up", + "buffer-export pdflatex", + "buffer-reload dump", + "lyx-quit"], }, vcs_info_export => { precondition => { command => [$git_exe, "ls-files", "--error-unmatch", "vcs_info_export.lyx"], workdir => "$data", }, - create => "vcs_info_export.tex", + src_files => ["vcs_info_export.lyx"], + check => [["vcs_info_export.tex", "vcs_info_export.tex.orig"]], command_line => ["-E", "pdflatex", "vcs_info_export.tex", "$data/vcs_info_export.lyx"], - } - ); + }, + "ams-import" => { + src_files => ["ams-import.tex"], + check_type => 'pdf', + check => [["ams-import.pdf", "ams-import.pdf"], + ["ams-import.lyx"]], + commands => ["buffer-new", + "buffer-import latex ams-import.tex", + "buffer-write", + "buffer-export pdf2", + "lyx-quit"], + }, + "compare_test" => { + src_files => ["old.lyx", "new.lyx"], + check_type => 'custom', + check_script => ["$perl","$test_bin/compare_custom.pl"], + test_dir => "$lyxsource/development/batchtests/compare_tests/", + check => [["diffs.lyx", "diffs.expected.lyx"]], + commands => [ + "dialog-show compare run-blocking $workdir/old.lyx $workdir/new.lyx", + "buffer-write-as $workdir/diffs.lyx", + "lyx-quit" + ], + }, +); die("Expected argument missing") if (! defined($ARGV[0])); my $test = $ARGV[0]; die("Invalid argument") if (! defined($Tests{$test})); -my $orig_lyx = "$data/$test.lyx"; -my $work_lyx = "$workdir/$test.lyx"; -my $expected = "$data/$test.tex.orig"; -my $created = "$workdir/$Tests{$test}->{create}"; +if (! -e $userdir) { + mkdir($userdir); +} -die("File \"$expected\" does not exist") if (! -e $expected); -# Create lyx-file to work with -copy($orig_lyx, $work_lyx) or die("Copy failed: $!"); -unlink($created); $ENV{LANG} = "en"; $ENV{LC_ALL} = "C"; $ENV{LANGUAGE} = "en_US"; -check_precondition(); -chdir($workdir); -my @command = ($lyx_exe, "-userdir", $userdir); -if (defined($Tests{$test}->{command_line})) { - push(@command, @{$Tests{$test}->{command_line}}); +if (defined $Tests{$test}->{test_dir}) { + my @dirs = read_dir($Tests{$test}->{test_dir}, prefix => 1); + foreach my $dir (@dirs) { + next unless -d $dir; + print "--- Running tests in $dir\n"; + run_tests($dir); + } } -if (defined($Tests{$test}->{commands})) { - push(@command, "-x", "command-sequence " . join(';', @{$Tests{$test}->{commands}})); +else { + run_tests($data); } -system1(@command); -die("Expected ($expected) and created ($created) files differ") if (compare($expected, $created) != 0); - exit(0); -sub check_precondition() + +sub run_tests { + my $test_dir = shift; + + if (-e "$test_dir/skip.test") { + my $skip_msg = read_file("$test_dir/skip.test"); + print "TEST SKIPPED.\n$skip_msg\n"; + return; + } + + my @expected = &addFiles($test_dir, $Tests{$test}->{check},1); + + my @created = &addFiles($workdir, $Tests{$test}->{check}, 0); + + # Copy src-files to work with + for my $f (@{$Tests{$test}->{src_files}}) { + copy("$test_dir/$f", "$workdir/$f") or die("Copy failed: $!"); + } + print "Unlinking " . join(' ', @created) . "\n"; + unlink(@created); + + &checkPrecondition(); + chdir($workdir); + my @command = ($lyx_exe, "-userdir", $userdir); + if (defined($Tests{$test}->{command_line})) { + push(@command, @{$Tests{$test}->{command_line}}); + } + if (defined($Tests{$test}->{commands}->[0])) { + if ($qt_version eq "QT5") { + push(@command, "-platform", "offscreen"); + } + if (defined($Tests{$test}->{commands}->[1])) { # more than one command + push(@command, "-x", "command-sequence " . join(';', @{$Tests{$test}->{commands}})); + } + else { + push(@command, "-x", $Tests{$test}->{commands}->[0]); + } + } + + &system1(@command); + + for (my $i = 0; defined($created[$i]); $i++) { + die("File \"$created[$i]\" not created") if (! -e "$created[$i]"); + + if (defined($expected[$i])) { + my $res = mycompare($Tests{$test}->{check_type}, $expected[$i], $created[$i], $Tests{$test}->{check_script}); + + die("Expected ($expected[$i]) and created ($created[$i]) files differ") if $res != 0; + } + } +} + +sub checkPrecondition() { return if (! defined($Tests{$test}->{precondition})); my $rPrecond = $Tests{$test}->{precondition}; @@ -84,7 +183,7 @@ sub check_precondition() if (defined($rPrecond->{workdir})) { chdir($rPrecond->{workdir}); } - my $result = system1(@command); + my $result = &system1(@command); print "Pre-condition result = $result\n"; die("Pre-condition error") if ($result != 0); } @@ -93,5 +192,77 @@ sub system1(@) { my ($exe, @params) = @_; print "Executing:\n\t$exe '" . join("' '", @params) . "'\n"; - system($exe, @params); + return(system($exe, @params)); +} + +# Create a list of file paths +# dir: result-dir +# rBases: List of base-names +sub addFiles($$$) +{ + my ($tdir, $rrBases, $idx) = @_; + my $dir; + if (defined($tdir)) { + $dir = "$tdir/"; + } + else { + $dir = ""; + } + my @result = (); + for my $rf (@{$rrBases}) { + my $path = undef; + if (defined($rf) && defined($rf->[$idx])) { + $path = "$dir$rf->[$idx]"; + } + push(@result, $path); + } + return(@result); +} + +sub mycompare($$$$) +{ + my ($check_type, $expected, $created, $check_script) = @_; + my $result; + + $check_type //= 'text'; + +if ($check_type eq 'pdf') { + my $cmd = $comparepdf; + + if ($cmd =~ /NOTFOUND/) { + # no check is done due to missing executable + } + else { + my @params = ( + "-ca", "-v=1", $expected, $created + ); + + my $error = ""; + if (&system1($cmd, @params) != 0) { + if ($? == -1) { + $error = sprintf("failed to execute: $cmd"); + } + elsif ($? & 127) { + $error = sprintf("$cmd with signal %d, %s coredump", + ($? & 127), ($? & 128) ? 'with' : 'without'); + } + else { + $error = sprintf("child $cmd exited with value %d", $? >> 8); + } + } + die($error) if ($error ne ""); + } + $result = 0; + } + elsif ($check_type eq 'custom') { + $result = system1(@$check_script, $expected, $created); + } + elsif ($check_type eq 'text') { + # defaut text comparision + $result = compare($created, $expected); + } + else { + die "Unknown check type: $check_type"; + } + return($result); }