]> git.lyx.org Git - lyx.git/blobdiff - lib/scripts/lyx_batch.pl.in
Cmake tests: Adapted BATCH tests to ignore the stored LyX-version
[lyx.git] / lib / scripts / lyx_batch.pl.in
index 7bd50bef205f99e58a1ccc4de2a875016ddd7b97..11c9627bfb4bddccd283b3aeafacf9337ba51299 100644 (file)
@@ -7,10 +7,12 @@ 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 add_files($$);
+sub addFiles($$$);
+sub mycompare($$$$);
 
 my $builddir = "@CMAKE_BINARY_DIR@";
 my $userdir = "$builddir/Testing/.lyxbatch";
@@ -19,22 +21,42 @@ 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
-# create := Files which are expected to be created in the build-dir
-# original := Files in the lyx-source, corresponding to the created ones,
-#             which we provide for comparison
-# commands := List of commands (lyx-functions) to be executed by lyx in a batch
+# 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 => {
     src_files => ["beamer_test.lyx"],
-    create => ["beamer_test.tex"],
-    original => ["beamer_test.tex.orig"],
+    check_type => 'custom',
+    check_script => ["$perl","$test_bin/compare_exported_tex.pl"],
+    check => [["beamer_test.tex", "beamer_test.tex.orig"]],
     commands => ["file-open beamer_test.lyx",
                  "buffer-begin",
                  "repeat 150 outline-down",
@@ -49,20 +71,34 @@ my %Tests = (
       workdir => "$data",
     },
     src_files => ["vcs_info_export.lyx"],
-    create => ["vcs_info_export.tex"],
-    original => ["vcs_info_export.tex.orig"],
+    check_type => 'custom',
+    check_script => ["$perl","$test_bin/compare_exported_tex.pl"],
+    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"],
-    create => ["ams-import.pdf", "ams-import.lyx"],
-    original => [undef, undef],
+    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]));
@@ -72,43 +108,78 @@ die("Invalid argument") if (! defined($Tests{$test}));
 if (! -e $userdir) {
   mkdir($userdir);
 }
-my @expected = &add_files($data, $Tests{$test}->{original});
-
-my @created = &add_files($workdir, $Tests{$test}->{create});
-
-# Copy src-files to work with
-for my $f (@{$Tests{$test}->{src_files}}) {
-  copy("$data/$f", "$workdir/$f") or die("Copy failed: $!");
-}
-print "Unlinking " . join(' ', @created) . "\n";
-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);
-for my $f (@created) {
-  die("File \"$f\" not created") if (! -e "$f");
-}
-for (my $i = 0; defined($created[$i]); $i++) {
-  if (defined($expected[$i])) {
-    die("Expected ($expected[$i]) and created ($created[$i]) files differ") if (compare($expected[$i], $created[$i]) != 0);
+exit(0);
+
+
+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;
+    }
   }
 }
-exit(0);
 
-sub check_precondition()
+sub checkPrecondition()
 {
   return if (! defined($Tests{$test}->{precondition}));
   my $rPrecond = $Tests{$test}->{precondition};
@@ -116,7 +187,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);
 }
@@ -125,23 +196,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 add_files($$)
+sub addFiles($$$)
 {
-  my ($dir, $rBases) = @_;
+  my ($tdir, $rrBases, $idx) = @_;
+  my $dir;
+  if (defined($tdir)) {
+    $dir = "$tdir/";
+  }
+  else {
+    $dir = "";
+  }
   my @result = ();
-  for my $f (@{$rBases}) {
-    if (defined($f)) {
-      push(@result, "$dir/$f");
+  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 {
-      push(@result, undef);
+      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;
   }
-  return(@result);
+  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);
 }