Current File : //usr/share/texlive/texmf-dist/tex/latex/qstest/qstest.sty |
%%
%% This is file `qstest.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% qstest.dtx (with options: `package,etex')
%%
%% IMPORTANT NOTICE:
%%
%% For the copyright see the source file.
%%
%% Any modified versions of this file must be renamed
%% with new filenames distinct from qstest.sty.
%%
%% For distribution of the original source see the terms
%% for copying and modification in the file qstest.dtx.
%%
%% This generated file may be distributed as long as the
%% original source files, as listed above, are part of the
%% same distribution. (The sources need not necessarily be
%% in the same archive or directory.)
\errorcontextlines=\maxdimen
%%
%% Copyright (C) 2006, 2007 QuinScape GmbH
%% http://www.quinscape.de
\NeedsTeXFormat{LaTeX2e}
\def\next$Id: #1.dtx #2 #3-#4-#5 #6${%
\ProvidesPackage{#1}[#3/#4/#5 1.#2 QuinScape Unit Test Package]
}
\next
$Id: qstest.dtx 7896 2007-02-21 14:03:26Z dkastrup $
\RequirePackage{makematch}
\newtoks\qst@tmptoks
\newcommand*{\TestErrors}{\MakeMatcher[,]\qst@errorcheck}
\TestErrors{*, !fails}
\newif\ifqst@error
\def\qst@ifqst@error{\qst@errorcheck\qst@options
\qst@errortrue\qst@errorfalse\ifqst@error}
\long\def\qst@error#1{%
\global\qst@testpassedfalse
\global\let\qst@lastfailure\qst@testname
\edef\qst@message{Failed: \qst@testname^^J#1}%
\@onelevel@sanitize\qst@message
\qst@failed}
\newif\ifqst@testpassed
\newcommand{\LogTests}[3]{%
\ifcsname qst:log:#1\endcsname \else
\expandafter\newwrite\csname qst:log:#1\endcsname
\qst@gpush\qst@passed{\qst@logentry+{#1}}%
\qst@gpush\qst@failed{\qst@logentry-{#1}}%
\global\expandafter\let\csname qst:+log:#1\endcsname\qst@matchnever
\global\expandafter\let\csname qst:-log:#1\endcsname\qst@matchnever
\fi
\expandafter\ifx \csname qst:+log:#1\endcsname \qst@matchnever
\PackageInfo{qstest}{Logging on: \jobname.#1}%
\ifnum\csname qst:log:#1\endcsname>\m@ne
\immediate\openout\csname qst:log:#1\endcsname\jobname.#1\relax
\fi
\fi
\MakeMatcher[,]\qst@tmp{#2}%
\global\expandafter\let\csname qst:+log:#1\endcsname\qst@tmp
\MakeMatcher[,]\qst@tmp{#3}%
\global\expandafter\let\csname qst:-log:#1\endcsname\qst@tmp
}
\long\def\qst@gpush#1#2{\xdef#1{\unexpanded{#2}%
\unexpanded\expandafter{#1}}}
\def\qst@logentry#1#2{\qst@maybelog#1{#2}{%
\immediate\write\csname qst:log:#2\endcsname{\qst@message}}}
\def\qst@maybelog#1#2#3{\csname qst:#1log:#2\endcsname\qst@options
{#3}{}}
\expandafter\let\csname qst:log:log\endcsname\m@ne
\global\expandafter\let\csname qst:+log:log\endcsname\qst@matchalways
\global\expandafter\let\csname qst:-log:log\endcsname\qst@matchalways
\def\qst@passed{\qst@maybelog+{log}%
{\PackageInfo{qstest}{\qst@message}}}
\def\qst@failed{\ifqst@error
\PackageError{qstest}{\qst@message}{}%
\else
\qst@maybelog-{log}{\PackageWarning{qstest}{\qst@message}}%
\fi}
\newcommand*\LogClose[1]{%
\expandafter\ifx \csname qst:+log:#1\endcsname\qst@matchnever
\else
\PackageInfo{qstest}{Logging off: \jobname.#1}%
\ifnum\csname qst:log:#1\endcsname>\m@ne
\immediate\closeout\csname qst:log:#1\endcsname
\fi
\global\expandafter\let\csname qst:+log:#1\endcsname\qst@matchnever
\global\expandafter\let\csname qst:-log:#1\endcsname\qst@matchnever
\fi
}
\def\IncludeTests{\MakeMatcher[,]\qst@includecheck}
\let\qst@includecheck\qst@matchalways
\RequirePackage{verbatim}
\newenvironment{qstest}[2]{%
\qst@testpassedtrue
\edef\qst@testname{\detokenize{#1}}%
\MakeMatchTarget[,]\qst@options{#2}%
\let\ifqst@error\qst@ifqst@error
\qst@includecheck\qst@options\ignorespaces{%
\let\endqstest\endcomment}}%
{\ifqst@testpassed
\edef\qst@message{Passed: \qst@testname}%
\qst@passed
\else
\ifx\qst@testname\qst@lastfailure
\else
\edef\qst@message{Failed: \qst@testname}%
\qst@failed
\fi
\fi}
\def\qst@testname{unspecified}
\newcommand\Expect[1][]{%
\edef\qst@tmpc{\unexpanded{#1}}%
\qst@expectarg\qst@defaultvalue\qst@expecttwo}
\def\qst@expectarg#1#2{%
\@ifstar{\qst@expectargii\edef#1#2}{\qst@expectargii\def#1#2}}
\def\qst@expectargii#1#2#3{\long\def\qst@tmp##1{%
#1#2####1####2####3####4####5####6####7####8####9{##1}%
\@onelevel@sanitize#2#3}%
\afterassignment\qst@expectargiii
\qst@tmptoks=}
\def\qst@expectargiii{\expandafter
\qst@tmp\expandafter{\the\qst@tmptoks}}
\def\qst@expecttwo{%
\ifx\qst@tmpc\@empty
\edef\qst@tmpc{\the\qst@tmptoks}%
\fi
\qst@expectarg\qst@tmpb\qst@expectfinish}
\def\qst@expectfinish{%
\ifx\qst@defaultvalue\qst@tmpb
\else
\qst@error{
\string\Expect: \unexpanded\expandafter{\qst@tmpc}^^J
<\qst@tmpb^^J
>\qst@defaultvalue}%
\fi}
\def\InRange#1#2{%
\ifcase
\ifdim\qst@defaultvalue<#1\@ne\fi
\ifdim\qst@defaultvalue>#2\@ne\fi
\tw@
\or
\qst@afterfi{{in [#1..#2]}}%
\or
\qst@afterfi{\expandafter{\qst@defaultvalue}}%
\fi}
\def\qst@afterfi#1#2\fi{\fi#1}
\newcommand*\NearTo[1]{%
\ifx[#1\expandafter\qst@nearto\expandafter[%]]
\else \qst@afterfi{\qst@nearto[0.05pt]{#1}}%
\fi}
\def\qst@nearto[#1]#2{%
\ifcase
\ifdim\qst@defaultvalue>\dimexpr#2+(#1)\relax \@ne\fi
\ifdim\qst@defaultvalue<\dimexpr#2-(#1)\relax \@ne\fi
\tw@
\or
\qst@afterfi{{near[#1] to #2}}%
\or
\qst@afterfi{\expandafter{\qst@defaultvalue}}%
\fi}
\newcommand\ExpectIfThen[1]{%
\ifthenelse{#1}{}{%
\qst@error{
\string\ExpectIfThen: \unexpanded{#1}%
}}}
\def\qst@advance#1{\edef#1{\number\numexpr(#1)+1}}
\long\def\qst@csmaketransition#1#2#3#4.{%
\qst@cssetstate{#1}%
\expandafter
\endgroup
\csname qst@cstrans:#2\expandafter\endcsname
\csname qst@cssaved\romannumeral\qst@csscope>\string#3\endcsname}
\def\CalledName#1{\expandafter\expandafter\expandafter\@gobble
\expandafter\strip@prefix\string#1}
\def\qst@csstate{\csname qst@csstate\romannumeral
\qst@csscope\endcsname}
\def\qst@cssetstate#1{%
\expandafter\expandafter\expandafter\xdef\qst@csstate{#1}}
\long\def\qst@csmakewildcard#1#2#3{\ifx#3\endExpectCallSequence
\else
\def\qst@csnomatch{\qst@csmaketransition{#1}{#2}}%
\fi
\qst@tmp}
\long\def\qst@cscheckempty#1#2{%
\ifcase\qst@cslockout{#1}\z@
\expandafter\def\expandafter\qst@cslockout
\expandafter##\expandafter1\expandafter{%
\qst@cslockout{##1}\ifnum##1=#1\@ne\fi}%
\expandafter\expandafter\expandafter\qst@tmp
\csname qst@csstate:#1\expandafter\endcsname\expandafter#2%
\or \expandafter\qst@tmp
\fi}
\long\def\qst@csnext#1#2{%
\begingroup
\edef\qst@csscope{#1}%
\let\qst@csnomatch=\qst@csunexpected
\def\qst@cslockout##1{\ifnum\qst@csstate=##1\@ne\fi}%
\long\def\qst@tmp##1#2##2{##2#2}%
\expandafter\expandafter\expandafter\qst@tmp
\csname qst@csstate:\qst@csstate\endcsname#2%
#2{\qst@csnomatch}.}
\long\def\qst@csunexpected#1#2.{%
\qst@error{
ExpectCallSequence: \string#1}%
\expandafter\expandafter\expandafter
\endgroup
\qst@cssavedcs#1%
}
\long\def\qst@cssavedcs#1{%
\csname qst@cssaved\romannumeral\qst@csscope>\string#1\endcsname}
\long\def\qst@csaddstate#1#2{%
\ifcsname qst@csstate:#1\endcsname \else
\expandafter\let\csname qst@csstate:#1\endcsname \@gobble
\fi
\long\expandafter
\def\csname qst@csstate:#1\expandafter\endcsname
\expandafter##\expandafter1\expandafter{\romannumeral
\expandafter\expandafter\expandafter\z@
\csname qst@csstate:#1\endcsname{##1}#2}}
\def\qst@csaddempty#1#2{%
\expandafter\qst@csaddstate\expandafter{\number#1\expandafter}%
\expandafter{\expandafter##\expandafter1\expandafter{\expandafter
\qst@cscheckempty\expandafter{\number#2}}}}
\def\qst@csallocstate{0}
\def\qst@csalloctrans{0}
\def\qst@csscope{0}
\newenvironment{ExpectCallSequence}[1]
{%
\qst@advance\qst@csscope
\qst@cssetstate{\qst@csallocstate}%
\let\qst@csgroupstate\qst@csallocstate
\qst@advance\qst@csgroupstate
\qst@advance\qst@csgroupstate
\let\qst@csstack\@empty
\qst@csparse.{}*(#1){...}%
}{%
\def\qst@cssavedcs{\@gobble}%
\expandafter\qst@csnext\expandafter\qst@csscope
\csname end {ExpectCallSequence}\endcsname}
\long\def\qst@csparse#1{%
\ifcsname qst@csparse:\string#1\endcsname
\csname qst@csparse:\string#1\expandafter\expandafter\expandafter
\endcsname
\expandafter\@gobble
\else
\expandafter\qst@csparsedefault
\fi{#1}}
\expandafter\def\csname qst@cstrans:0\endcsname
#1{\expandafter\let\csname\CalledName#1\endcsname= #1%
\let#1=\@undefined
\csname\CalledName#1\endcsname}
\qst@csaddstate0{#1{\qst@csmakewildcard00}}
\qst@csaddempty{0}{1}
\expandafter\qst@csaddstate\expandafter1\expandafter{%
\csname end {ExpectCallSequence}\endcsname{\qst@csmaketransition21}}
\expandafter\let\csname qst@cstrans:1\endcsname\@gobble
\def\qst@csalloctrans{2}
\def\qst@csallocstate{3}
\expandafter\let\csname end {ExpectCallSequence}\endcsname
\endExpectCallSequence
\expandafter\def\csname qst@csparse:...\endcsname{%
\ifx\qst@csstack\@empty
\else
\PackageError{qstest}{Unmatched `(' in call sequence %)
specification}{You need to fix this}%
\loop
\qst@csstack
\ifx\qst@csstack\@empty
\else
\repeat
\fi
\qst@csaddempty{\qst@csallocstate}{0}%
\qst@advance\qst@csallocstate
\ignorespaces}
\long\def\qst@csparsedefault#1{%
\ifcsname qst@cssaved\romannumeral\qst@csscope>\string#1\endcsname
\else \protected
\edef\qst@tmp{\noexpand\qst@csnext \qst@csscope \noexpand#1}%
\ifx#1\qst@tmp
\else
\expandafter\let
\csname qst@cssaved\romannumeral\qst@csscope>\string#1\endcsname
= #1%
\let#1\qst@tmp
\fi
\fi
\qst@csparsetransition{#1}\qst@csmaketransition}
\long\def\qst@csparsetransition#1#2{%
\let\qst@cslaststate\qst@csallocstate
\qst@advance\qst@csallocstate
\long\edef\qst@tmp##1##2{%
\noexpand\qst@csaddstate{\qst@cslaststate}{%
##1{%
##2{\qst@csallocstate}%
{\qst@csalloctrans}}}}%
\qst@tmp{#1}{#2}%
\expandafter\qst@advance\expandafter\qst@csalloctrans
\expandafter\afterassignment\expandafter\qst@csparse
\expandafter\long\expandafter\def
\csname qst@cstrans:\qst@csalloctrans\endcsname}
\expandafter\def\csname qst@csparse:.\endcsname{%
\qst@csparsetransition{##1}\qst@csmakewildcard}
\expandafter\def\csname qst@csparse:?\endcsname{%
\qst@csensurelaststate?%
\qst@csaddempty\qst@cslaststate\qst@csallocstate
\let\qst@cslaststate\@undefined
\qst@csparse}
\def\qst@csensurelaststate#1{\ifx\qst@cslaststate\@undefined
\PackageError{qstest}{Unexpected `#1' in call sequence}{%
Expect chaos to ensue}%
\def\qst@cslaststate{0}%
\fi}
\expandafter\def\csname qst@csparse:*\endcsname{%
\qst@csensurelaststate*%
\qst@csaddempty\qst@csallocstate\qst@cslaststate
\qst@advance\qst@csallocstate
\qst@csaddempty\qst@cslaststate\qst@csallocstate
\let\qst@cslaststate\@undefined
\qst@csparse}
\expandafter\def\csname qst@csparse:+\endcsname{%
\qst@csensurelaststate+%
\qst@csaddempty\qst@csallocstate\qst@cslaststate
\let\qst@cslaststate\qst@csallocstate
\qst@advance\qst@csallocstate
\qst@csaddempty\qst@cslaststate\qst@csallocstate
\let\qst@cslaststate\@undefined
\qst@csparse}
\expandafter\def\csname qst@csparse:(\endcsname{%
\edef\qst@csstack{\def\noexpand\qst@csstack{%
\unexpanded\expandafter{\qst@csstack}%
}%
\def\noexpand\qst@csgroupstate{\qst@csgroupstate}}%
\let\qst@csgroupstate\qst@csallocstate
\qst@advance\qst@csallocstate
\qst@csaddempty\qst@csgroupstate\qst@csallocstate
\qst@csparse}
\expandafter\def\csname qst@csparse:|\endcsname{%
\let\qst@cslaststate\qst@csallocstate
\edef\qst@csstack{\unexpanded\expandafter{\qst@csstack}%
\noexpand\qst@csaddempty{\qst@cslaststate}%
\noexpand\qst@csallocstate}%
\qst@advance\qst@csallocstate
\qst@csaddempty\qst@csgroupstate\qst@csallocstate
\let\qst@cslaststate\@undefined
\qst@csparse}
\expandafter\def\csname qst@csparse:)\endcsname{%
\let\qst@cslaststate\qst@csgroupstate
\ifx\qst@csstack\@empty
\PackageError{qstest}{Unmatched `)' in call sequence
specification}{You need to fix this}%
\fi
\qst@csstack
\qst@csparse
}
\expandafter\def\csname qst@csparse:`\endcsname{%
\qst@cssetstate{\qst@csallocstate}%
\let\qst@cslaststate\@undefined
\qst@csparse}
\expandafter\let\csname qst@csparse:^\expandafter\endcsname
\csname qst@csparse:`\endcsname
\expandafter\def\csname qst@csparse:'\endcsname{%
\qst@csaddempty{\qst@csallocstate}{1}%
\let\qst@cslaststate\qst@csallocstate
\qst@advance\qst@csallocstate
\qst@csparse}
\expandafter\let\csname qst@csparse:$%$
\expandafter\endcsname\csname qst@csparse:'\endcsname
\newcommand*\SaveValueFile[1]{%
\ifnum\qst@savefile=\@auxout
\newwrite\qst@savefile
\else
\immediate\closeout\qst@savefile
\fi
\immediate\openout\qst@savefile #1\relax}
\def\qst@savefile{\@auxout}
\newcommand*\CloseValueFile{%
\ifnum\qst@savefile=\@auxout
\else
\immediate\closeout\qst@savefile
\fi}
\newcommand\SaveValue[1]{%
\edef\qst@tmpc{\detokenize{#1}}%
\ifnum\qst@savefile=\@auxout
\ifx\@onlypreamble\AtBeginDocument
\else
\PackageError{qstest}{You need to specify \string\SaveValueFile^^J
for test files without document.}{I can't use
`\string\SaveValue' before either `\string\begin%
{document}'^^J
or `\string\SaveValueFile'}%
\fi
\fi
\qst@expectarg\qst@defaultvalue\qst@saveval}
\def\qst@saveval{%
{\immediate\write\qst@savefile{\string\InternalSetValue^^J%
\expandafter\qst@cleanlf\qst@tmpc\qst@endcleanlf^^J%
\expandafter\qst@cleanlf\qst@defaultvalue\qst@endcleanlf^^J%
\string\EndInternalSetValue^^J}}}
\def\qst@cleanlf#1^^J{#1^%
^J\qst@cleanlf}
\def\qst@endcleanlf^%
^J\qst@cleanlf{:^^J}
\newcommand*\InternalSetValue{\begingroup
\let\do\@makeother\dospecials
\endlinechar`\^^J
\catcode`\^7
\qst@setsavedii}
\begingroup
\catcode`\!=12
\lccode`\!=`\\
\lowercase{\endgroup
\def\qst@setsavedii#1:^^J#2:^^J!}EndInternalSetValue^^J{\endgroup
\expandafter\gdef\csname qst@value:\detokenize{#1}\endcsname{#2}}
\newcommand*{\EndInternalSetValue}{%
\PackageError{qstest}{\string\InternalSetValue\space got confused}%
{You probably wrote something bad to the save file}}
\def\SavedValue#1{%
\ifcsname qst@value:\detokenize{#1}\endcsname
\expandafter\expandafter\expandafter
{\csname qst@value:\detokenize{#1}\expandafter\endcsname\expandafter}%
\else
\expandafter\expandafter\expandafter{\expandafter\qst@defaultvalue
\expandafter}%
\fi}
\endinput
%%
%% End of file `qstest.sty'.