%%
%% This is file `fifo-stack-test.tex',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% fifo-stack.dtx  (with options: `qstest')
%% 
%% Copyright (C) 2014 Stephen Gaito (PerceptiSys Ltd)
%% 
%% This work may be distributed and/or modified under the conditions of the LaTeX
%% Project Public License, either version  1.3  of  this license or (at your
%% option) any later version.
%% 
%% The latest version of this license is in http://www.latex-project.org/lppl.txt
%% and  version 1.3 or later is part of all distributions of LaTeX version
%% 2005/12/01 or later.
%% 
%% This work has the LPPL maintenance status `maintained'.
%% 
%% The Current Maintainer of this work is Stephen Gaito.
%% 
%% The released source can be found at:
%% https://github.com/diSimplex/latexFifoStack/tree/master/texStyle
%% 
%% The development source can be found at:
%% https://github.com/stephengaito/latexFifoStack/tree/master/texStyle
%% 
%% This work consists of the files fifo-stack.dtx, and fifo-stack.ins.
%% 
%% The command:
%%   pdflatex fifo-stack.ins
%% followed by:
%%   pdflatex fifo-stack.dtx
%% will produce the derived files: fifo-stack.sty, fifo-stack-test.tex,
%% and fifo-stack.pdf.
%% 
%% The command:
%%   pdflatex fifo-stack-test.tex
%% will regression test the fifo-stack package. Output will be found in
%% fifo-stack-test.lgout. If pdflatex completes with no errors, then all
%% regression tests passed.
%% 
\RequirePackage{qstest}
\RequirePackage{xifthen}
\IncludeTests{*}
\LogTests{lgout}{*}{*}
\RequirePackage{fifo-stack}
\begin{qstest}{Simple stack integration test}
  {\FSCreate, \FSPush, \FSPop, \FSTop}

  \FSCreate{testStack}{defaultValue}
  \Expect*{\FSTop{testStack}}{defaultValue}
  \FSPush{testStack}{firstValue}
  \Expect*{\FSTop{testStack}}{firstValue}
  \FSPush{testStack}{secondValue}
  \Expect*{\FSTop{testStack}}{secondValue}
  \FSPush{testStack}{thirdValue}
  \Expect*{\FSTop{testStack}}{thirdValue}
  \FSPop{testStack}
  \Expect*{\FSTop{testStack}}{secondValue}
  \FSPop{testStack}
  \Expect*{\FSTop{testStack}}{firstValue}
  \FSPop{testStack}
  \Expect*{\FSTop{testStack}}{defaultValue}
  \FSPop{testStack}
  \Expect*{\FSTop{testStack}}{defaultValue}
\end{qstest}
\begin{qstest}{Up down up down stack integration test}
  {\FSCreate, \FSPush, \FSPop, \FSTop}

  \FSCreate{testStackUDUD}{defaultValue}
  \Expect*{\FSTop{testStackUDUD}}{defaultValue}
  \FSPush{testStackUDUD}{firstValue}
  \Expect*{\FSTop{testStackUDUD}}{firstValue}
  \FSPush{testStackUDUD}{secondValue}
  \Expect*{\FSTop{testStackUDUD}}{secondValue}
  \FSPop{testStackUDUD}
  \Expect*{\FSTop{testStackUDUD}}{firstValue}
  \FSPush{testStackUDUD}{newSecondValue}
  \Expect*{\FSTop{testStackUDUD}}{newSecondValue}
\end{qstest}
\begin{qstest}{Simple FIFO integration test}
  {\FSCreate, \FSPush, \FSShift, \FSTop, \FSBottom}

  \FSCreate{testFifo}{defaultValue}
  \Expect*{\FSTop{testFifo}}{defaultValue}
  \Expect*{\FSBottom{testFifo}}{defaultValue}
  \FSPush{testFifo}{firstValue}
  \Expect*{\FSTop{testFifo}}{firstValue}
  \Expect*{\FSBottom{testFifo}}{firstValue}
  \FSPush{testFifo}{secondValue}
  \Expect*{\FSTop{testFifo}}{secondValue}
  \Expect*{\FSBottom{testFifo}}{firstValue}
  \FSShift{testFifo}
  \Expect*{\FSTop{testFifo}}{secondValue}
  \Expect*{\FSBottom{testFifo}}{secondValue}
  \FSPush{testFifo}{thirdValue}
  \Expect*{\FSTop{testFifo}}{thirdValue}
  \Expect*{\FSBottom{testFifo}}{secondValue}
  \FSShift{testFifo}
  \Expect*{\FSTop{testFifo}}{thirdValue}
  \Expect*{\FSBottom{testFifo}}{thirdValue}
  \FSShift{testFifo}
  \Expect*{\FSTop{testFifo}}{defaultValue}
  \Expect*{\FSBottom{testFifo}}{defaultValue}
  \FSShift{testFifo}
  \Expect*{\FSTop{testFifo}}{defaultValue}
  \Expect*{\FSBottom{testFifo}}{defaultValue}
\end{qstest}
\begin{qstest}{Simple linear use of unshift/shift}
  {\FSUnshift, \FSShift}

  \FSCreate{testRStack}{defaultValue}
  \Expect*{\FSBottom{testRStack}}{defaultValue}
  \FSUnshift{testRStack}{firstValue}
  \Expect*{\FSBottom{testRStack}}{firstValue}
  \FSUnshift{testRStack}{secondValue}
  \Expect*{\FSBottom{testRStack}}{secondValue}
  \FSUnshift{testRStack}{thirdValue}
  \Expect*{\FSBottom{testRStack}}{thirdValue}
  \FSShift{testRStack}
  \Expect*{\FSBottom{testRStack}}{secondValue}
  \FSShift{testRStack}
  \Expect*{\FSBottom{testRStack}}{firstValue}
  \FSShift{testRStack}
  \Expect*{\FSBottom{testRStack}}{defaultValue}
  \FSShift{testRStack}
  \Expect*{\FSBottom{testRStack}}{defaultValue}
\end{qstest}
\begin{qstest}{Full non-linear FIFO/stack integration test}
  {\FSCreate, \FSPush, \FSPop, \FSUnshift, \FSShift, \FSTop, \FSBottom}

  \FSCreate{testFS}{defaultValue}
  \Expect*{\FSTop{testFS}}{defaultValue}
  \Expect*{\FSBottom{testFS}}{defaultValue}
  \FSPush{testFS}{value1}
  \Expect*{\FSTop{testFS}}{value1}
  \Expect*{\FSBottom{testFS}}{value1}
  \FSUnshift{testFS}{value-1}
  \Expect*{\FSTop{testFS}}{value1}
  \Expect*{\FSBottom{testFS}}{value-1}
  \FSShift{testFS}
  \Expect*{\FSTop{testFS}}{value1}
  \Expect*{\FSBottom{testFS}}{value1}
  \FSPush{testFS}{value2}
  \Expect*{\FSTop{testFS}}{value2}
  \Expect*{\FSBottom{testFS}}{value1}
  \FSUnshift{testFS}{value-1again}
  \Expect*{\FSTop{testFS}}{value2}
  \Expect*{\FSBottom{testFS}}{value-1again}
  \FSUnshift{testFS}{value-2}
  \Expect*{\FSTop{testFS}}{value2}
  \Expect*{\FSBottom{testFS}}{value-2}
  \FSPop{testFS}
  \Expect*{\FSTop{testFS}}{value1}
  \Expect*{\FSBottom{testFS}}{value-2}
  \FSPop{testFS}
  \Expect*{\FSTop{testFS}}{value-1again}
  \Expect*{\FSBottom{testFS}}{value-2}
  \FSShift{testFS}
  \Expect*{\FSTop{testFS}}{value-1again}
  \Expect*{\FSBottom{testFS}}{value-1again}
  \FSPop{testFS}
  \Expect*{\FSTop{testFS}}{defaultValue}
  \Expect*{\FSBottom{testFS}}{defaultValue}
  \FSPop{testFS}
  \Expect*{\FSTop{testFS}}{defaultValue}
  \Expect*{\FSBottom{testFS}}{defaultValue}
  \FSShift{testFS}
  \Expect*{\FSTop{testFS}}{defaultValue}
  \Expect*{\FSBottom{testFS}}{defaultValue}
\end{qstest}
\begin{qstest}{FSClear, FSSize, and FSDestroy test}
  {\FSCreate, \FSPush, \FSPop, \FSUnshift, \FSShift, \FSTop,
   \FSBottom, \FSClear, \FSDestroy, \FSSize}

  \FSCreate{testFSC}{defaultValue}
  \Expect*{\FSSize{testFSC}}{0}
  \Expect*{\FSTop{testFSC}}{defaultValue}
  \Expect*{\FSBottom{testFSC}}{defaultValue}
  \FSPush{testFSC}{value1}
  \Expect*{\FSSize{testFSC}}{1}
  \Expect*{\FSTop{testFSC}}{value1}
  \Expect*{\FSBottom{testFSC}}{value1}
  \FSUnshift{testFSC}{value-1}
  \Expect*{\FSSize{testFSC}}{2}
  \Expect*{\FSTop{testFSC}}{value1}
  \Expect*{\FSBottom{testFSC}}{value-1}
  \FSPush{testFSC}{value2}
  \Expect*{\FSSize{testFSC}}{3}
  \Expect*{\FSTop{testFSC}}{value2}
  \Expect*{\FSBottom{testFSC}}{value-1}
  \FSUnshift{testFSC}{value-2}
  \Expect*{\FSSize{testFSC}}{4}
  \Expect*{\FSTop{testFSC}}{value2}
  \Expect*{\FSBottom{testFSC}}{value-2}
  \FSClear{testFSC}
  \Expect*{\FSSize{testFSC}}{0}
  \Expect*{\FSTop{testFSC}}{defaultValue}
  \Expect*{\FSBottom{testFSC}}{defaultValue}
  \FSPush{testFSC}{value1}
  \Expect*{\FSSize{testFSC}}{1}
  \Expect*{\FSTop{testFSC}}{value1}
  \Expect*{\FSBottom{testFSC}}{value1}
  \FSUnshift{testFSC}{value-1}
  \Expect*{\FSSize{testFSC}}{2}
  \Expect*{\FSTop{testFSC}}{value1}
  \Expect*{\FSBottom{testFSC}}{value-1}
  \FSPush{testFSC}{value2}
  \Expect*{\FSSize{testFSC}}{3}
  \Expect*{\FSTop{testFSC}}{value2}
  \Expect*{\FSBottom{testFSC}}{value-1}
  \FSUnshift{testFSC}{value-2}
  \Expect*{\FSSize{testFSC}}{4}
  \Expect*{\FSTop{testFSC}}{value2}
  \Expect*{\FSBottom{testFSC}}{value-2}
  \FSDestroy{testFSC}
\end{qstest}
\begin{qstest}{Unit test of \fifo@stack@pointer}{\fifo@stack@pointer}
  \makeatletter
  \Expect*{\fifo@stack@pointer{1}}{ii}
  \Expect*{\fifo@stack@pointer{0}}{i}
  \Expect*{\fifo@stack@pointer{-1}}{@i}
  \makeatother
\end{qstest}
\begin{qstest}{Unit test of \FSdestroy}
  {\FSCreate, \FSDestroy}

  \FSCreate{testFSDestroy}{defaultValue}
  \makeatletter
  \ExpectIfThen{\isnamedefined{testFSDestroy@fifo@stack@count@top}}
  \ExpectIfThen{\isnamedefined{testFSDestroy@fifo@stack@count@bottom}}
  \ExpectIfThen{\isnamedefined{testFSDestroy@fifo@stack@count@size}}
  \ExpectIfThen{\isnamedefined{fifo@stack@top@testFSDestroy}}
  \ExpectIfThen{\isnamedefined{fifo@stack@bottom@testFSDestroy}}
  \makeatother
  \FSDestroy{testFSDestroy}
  \makeatletter
  \ExpectIfThen{\isundefined\testFSDestroy@fifo@stack@count@top}
  \ExpectIfThen{\isundefined\testFSDestroy@fifo@stack@count@bottom}
  \ExpectIfThen{\isundefined\testFSDestroy@fifo@stack@count@size}
  \ExpectIfThen{\isundefined\fifo@stack@top@testFSDestroy}
  \ExpectIfThen{\isundefined\fifo@stack@bottom@testFSDestroy}
  \makeatother
\end{qstest}
\begin{qstest}{Unit test of \FSPush and \FSTop}
  {\FSCreate, \FSPush, \FSTop}

  \FSCreate{testFSPush}{defaultValue}
  \Expect*{\FSTop{testFSPush}}{defaultValue}
  \FSPush{testFSPush}{\FSTop{testFSPush}-with-additional-text}
  \Expect*{\FSTop{testFSPush}}{defaultValue-with-additional-text}
\end{qstest}
\begin{qstest}{Unit test of \FSUnshift and \FSBottom}
  {\FSCreate, \FSUnshift, \FSBottom}

  \FSCreate{testFSUnshift}{defaultValue}
  \Expect*{\FSBottom{testFSUnshift}}{defaultValue}
  \FSUnshift{testFSUnshift}{\FSBottom{testFSUnshift}-with-additional-text}
  \Expect*{\FSBottom{testFSUnshift}}{defaultValue-with-additional-text}
\end{qstest}
\LogClose{lgout}
\stop
\endinput
%%
%% End of file `fifo-stack-test.tex'.
