%%%%%%%%%%%
%  SETUP  %
%%%%%%%%%%%

\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[usenames,x11names,table]{xcolor}

\usepackage{listings}
\usepackage{enumitem}
\usepackage{graphicx}
\usepackage{framed}
\usepackage{calc}
\usepackage{ifthenx}
\usepackage{tabularx}
\usepackage{soul}

%%% -------------------------------------------------------
%%% universal formatting
%%% -------------------------------------------------------

\parindent 0pt
\frenchspacing
\pagestyle{empty}

\setlength{\oddsidemargin}{0in}
\setlength{\evensidemargin}{0in}
\setlength{\marginparsep}{0in}
\setlength{\marginparwidth}{0in}
\setlength{\textwidth}{6.5in}

\setlength{\topmargin}{0in}
\setlength{\headsep}{0in}
\setlength{\headheight}{0in}
\setlength{\textheight}{9in}

%%% -------------------------------------------------------
%%% custom commands
%%% -------------------------------------------------------

% a horizontal box with coloured background
\newcommand{\myheading}[1]{
	{
		\definecolor{shadecolor}{named}{Azure4}
		\begin{snugshade*}
			\centering\large
			\textcolor{white}{\textbf{-- #1 --}\vphantom{p\^{E}}}
		\end{snugshade*}
	}
}

\newcommand{\myhl}[1]{
	{
		\color{Snow1}
		\sethlcolor{Red1}
		\hl{#1}
	}
}

\newcommand{\mymacrow}[2]{
	\footnotesize\textcolor{DarkOrchid3}{\textbf{#1}}: & \small #2 \\[8pt]
}

\newcommand{\mytermrow}[2]{
	\tt\bf\small #1 & \tt\small #2 \\
}



\begin{document}
	
	% setup
	\frenchspacing
	
	% C styling
	\lstdefinestyle{customc}{
		language=C,
		basicstyle=\small\ttfamily,
		breaklines=true,
		keepspaces=true,
		xleftmargin=\parindent,
		% colours
		commentstyle=\color{DodgerBlue2},
		identifierstyle=\color{Red1},
		keywordstyle=\color{Purple3},
		stringstyle=\color{SpringGreen4},
		numbers=left,
		showstringspaces=false,
	}


	\myheading{usage}

	Your tests should be written as a single .c file separate from
	the body of text containing your functionality to be tested.
	A simple example might look something like this: \\ 

	\hrule
	\lstset{style=customc}
	\lstinputlisting{a_simple_example.c}
	\hrule
	\pagebreak

	If both tests above succeed, the output will look like this:\\

	\hrule
	\vspace{8pt}

	% successful output
	\begin{tabular*}{\textwidth}{r@{\ \tt\bf :: }l}
		\mytermrow{1}{\color{Yellow4}description of the first test}
		\mytermrow{2}{\color{Yellow4}this is the second test}
		\mytermrow{ }{\color{DodgerBlue2}grabbing heap string...}
		\mytermrow{ }{\color{SpringGreen4}success!}
	\end{tabular*}

	\vspace{8pt}
	\hrule
	\vspace{20pt}

	If the first test fails, it will look something like this:\\
	\hrule
	\vspace{8pt}

	% failed output
	\begin{tabular*}{\textwidth}{r@{\ \tt\bf :: }l}
		\mytermrow{1}{\color{Yellow4}description of the first test}
		\mytermrow{ }{\color{Red1}FAIL: error message shown on failing}
		\mytermrow{ }{\textcolor{SpringGreen4}{\textbf{\ \ expected:}}6}
		\mytermrow{ }{\textcolor{Red1}{\textbf{\ \ \ \ actual:}}0}
	\end{tabular*}
	
	\vspace{8pt}
	\hrule

	\pagebreak

	\myheading{defined macros}
	\begin{tabularx}{\textwidth}{r@{\ }X}
		\mymacrow{BEGIN\_TEST}{
			must appear before all tests and 
			after all global variable declarations
		}
		\mymacrow{END\_TEST}{
			must appear at the end of your test
			program
		}
		\mymacrow{CLEANUP(statements)}{
			this defines a list of statements to run
			when the test exits, either successfully or
			on a failure. it isn't necessary for a test
			to run, but, if it does appear, it must be
			after the declaration of all variables to
			which it makes reference.
		}
		\mymacrow{RETURN()}{
			place at the end of a test which uses
			CLEANUP to ensure it is called before the
			test exits. i couldn't find any way around
			this without using more than just one
			header file, so i hope it isn't too annoying.
		}
		\mymacrow{STATE(description)}{
			show a prettily-formatted description of the
			program's state during a test. takes printf-style
			arguments.
		}
		\mymacrow{EXPECT\_ZERO(summary, arg)}{
			fail if \texttt{arg} does not resolve to 0
		}
		\mymacrow{EXPECT\_ONE(summary, arg)}{
			fail if \texttt{arg} does not resolve to 1
		}
		\mymacrow{EXPECT\_GREATER\_THAN\_ZERO(summary, arg)}{
			fail if \texttt{arg} does not resolve to a value
			greater than 0. this will be replaced with more
			generic integer comparisons soon.
		}
		\mymacrow{EXPECT\_INT(summary, arg1, arg2)}{
			fail if \texttt{arg2} does not match the
			expected integer value \texttt{arg1}
		}
		\mymacrow{EXPECT\_EQUAL\_INT(summary, arg1, arg2)}{
			fail if \texttt{arg1} and \texttt{arg2} are
			not equal
		}
		\mymacrow{EXPECT\_UNEQUAL\_INT(summary, arg1, arg2)}{
			fail if \texttt{arg1} and \texttt{arg2} are
			equal
		}
		\mymacrow{EXPECT\_STR(summary, arg1, arg2)}{
			fail if string \texttt{arg2} does not match the
			expected string value \texttt{arg1}
		}
		\mymacrow{EXPECT\_EQUAL\_STR(summary, arg1, arg2)}{
			fail if \texttt{arg1} and \texttt{arg2} are
			not equivalent strings
		}
		\mymacrow{EXPECT\_UNEQUAL\_STR(summary, arg1, arg2)}{
			fail if \texttt{arg1} and \texttt{arg2} are
			equivalent strings
		}
	\end{tabularx}

\end{document}

