dotfiles/texmf/tex/latex/pgfplots/pgfregressiontest.sty
Frank Villaro-Dixon 29dbca65ee random LaTeX stuff
2015-03-01 18:44:47 +01:00

159 lines
5.9 KiB
TeX

%--------------------------------------------------
% Provides a feature for fully automated regression testing of PGF or derived works.
%
% DEPRECATED.
% The idea might be interesting, but it is simply did not work and is
% too complicated. Don't use it.
%
% Idea:
% - it is based on the 'external' lib of pgf (which automatically exports each tikzpicture to pdf).
% - modification: in addition to the pdf export, call imagemagick's convert
% tool to export to png as well and compare the png to a reference image.
% - pgfregressiontest.sty provides two modes:
% 1) the REFERENCE GENERATION mode
% - each image knows a reference revision tag (or the system default)
% - the 'system call' makes a "checkout" of the desired revision,
% generates the image and returns to the original revision
% - the images are stored with a unique prefix.
% 2) the COMPARISON mode
% - each tikzpicture is compared to its reference image. If there
% is none, it should be generated.
% - if the comparison fails, a protocol is generated and the user
% is alerted.
%--------------------------------------------------
%
\ProvidesPackage{pgfregressiontest}[2010/10/31 Version 0.1]
\RequirePackage{tikz}
\usetikzlibrary{external}
\def\pgfregression@invokecmdkey#1#2{%
\pgfkeysvalueof{/pgf/regression/#1/.@cmd}#2\pgfeov
}%
\newif\ifpgfregressionpreamble
\pgfregressionpreambletrue
\def\pgfregressiontestset{\pgfqkeys{/pgf/regression}}%
\pgfqkeys{/pgf/regression}{%
% will be set in \begin{document}
system call original/.initial=<not yet set>,
%
% 'rev checkout' can be used to manually change the environment
% state before actually generating the image.
% Example:
% 'rev checkout=cd ~/code/tex/pgfplots ; git checkout 1.3'
% or something like this.
%
% Use 'rev restore' to immediately undo the effects. All that
% stuff is executed in one shell environment, i.e. you can define
% and use shell variables.
rev checkout/.code=\def\pgfregression@revcheckout{#1},
rev checkout={},
rev restore/.code=\def\pgfregression@revrestore{#1},
rev restore={},
reference prefix/.initial=reference_images/,
protocol file/.initial=\jobname.protocol.sh,
convert to png/.initial={convert "\image.pdf" "\image.png"},%
reference mode/.code={
\def\pgfregr@replacement@syscall{%
\ifx\pgfregression@revcheckout\pgfutil@empty
\else
\pgfregression@revcheckout;^^J%
@echo "'rev checkout' was successful, generating pdf...";^^J%
\fi
mkdir -p \pgfkeysvalueof{/pgf/regression/reference prefix};^^J%
\pgfkeysvalueof{/pgf/regression/system call original}; EXITCODE=$$?; \\^^J%
\ifx\pgfregression@revrestore\pgfutil@empty
\else
\pgfregression@revrestore; \\^^J%
echo "'rev restore' was successful.";^^J%
\fi
@if [ "$$EXITCODE" != "0" ]; then echo "pdf generation failed; Abort"; false; fi;^^J%
\pgfkeysvalueof{/pgf/regression/convert to png};^^J%
}%
\def\pgfregr@style{%
\message{^^Jpgfregressiontest: Running in REFERENCE GENERATION mode.^^J}%
\pgfqkeys{/pgf/regression}{%
/tikz/external/prefix=\pgfkeysvalueof{/pgf/regression/reference prefix},
}%
}%
\ifpgfregressionpreamble
\else
\pgfkeyslet{/tikz/external/system call}\pgfregr@replacement@syscall
\pgfregr@style
\fi
},
comparison mode/.code={
\def\pgfregr@replacement@syscall{%
\pgfkeysvalueof{/pgf/regression/system call original};^^J%
\pgfkeysvalueof{/pgf/regression/convert to png};^^J%
diff "\image.png" "\expandafter\expandafter\expandafter\pgfregr@get@reference@image@for\image\relax.png";^^J%
if [ ! $? -eq 0 ]; then ^^J
echo 'echo "file \image.pdf differs from \expandafter\expandafter\expandafter\pgfregr@get@reference@image@for\image\relax.pdf (displaying differences now)".' >> \pgfkeysvalueof{/pgf/regression/protocol file};^^J
echo 'convert "\image.png" "\expandafter\expandafter\expandafter\pgfregr@get@reference@image@for\image\relax.png" -compose difference -composite -colorspace gray miff:- | display' >>\pgfkeysvalueof{/pgf/regression/protocol file};^^J%
else^^J
rm -f "\image.png";^^J%
fi;^^J%
}%
\def\pgfregr@style{%
\message{^^Jpgfregressiontest: Running in COMPARISON mode.^^J}%
\expandafter\def\expandafter\pgfregr@get@reference@image@for\tikzexternal@filenameprefix####1\relax{%
\pgfkeysvalueof{/pgf/regression/reference prefix}####1%
}%
}%
\ifpgfregressionpreamble
\else
\pgfkeyslet{/tikz/external/system call}\pgfregr@replacement@syscall
\pgfregr@style
\fi
},
comparison mode,
}
% Check for "command line arguments".
% if 'pdflatex '\def\referencemode{1}\input{filename}' has been used,
% the 'reference mode' will be enabled. Otherwise we are in
% 'comparison mode'.
\expandafter\ifx\csname referencemode\endcsname\relax
\pgfregressiontestset{comparison mode}%
\message{^^Jpgfregressiontest: use pdflatex '\string\def\string\referencemode{1}\string\input{\jobname}' to enable reference generation.^^J}%
\else
\pgfregressiontestset{reference mode}%
\fi
\AtBeginDocument{%
\tikzifexternalizehasbeencalled{}{%
\PackageError{pgfregressiontest}{%
Please call \string\tikzexternalize\space somewhere in your preamble. I can only perform my tests together with image externalization}{}%
}%
\pgfkeysgetvalue{/tikz/external/system call}\pgfregression@temp
\pgfkeyslet{/pgf/regression/system call original}\pgfregression@temp
%
\pgfkeyslet{/tikz/external/system call}\pgfregr@replacement@syscall
\pgfregr@style
%
\immediate\openout\w@pgf@writea=\pgfkeysvalueof{/pgf/regression/protocol file} %
\immediate\closeout\w@pgf@writea
%
\global\pgfregressionpreamblefalse
}
\AtEndDocument{%
\openin\r@pgf@reada=\pgfkeysvalueof{/pgf/regression/protocol file} %
\ifeof\r@pgf@reada
\else
\message{
^^J%
======================================^^J%
There have been regression errors.^^J%
Use^^J%
>> bash \pgfkeysvalueof{/pgf/regression/protocol file}^^J%
to visualize them.^^J%
======================================^^J%
}%
\fi
}%