%%%%%%%%%%%
%  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{\myrow}[2]{
	\footnotesize\textcolor{DarkOrchid3}{\textbf{#1}}: & \small #2 \\[8pt]
}


\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{simple_test.c}
	\hrule
	\pagebreak

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

	\hrule
	\vspace{8pt}

	\begin{tabular*}{\textwidth}{r@{\ \tt\bf :: }l}
		\tt\bf\small 1 & \tt\small\color{Brown3}description of the first test \\
		\tt\bf\small 2 & \tt\small\color{Brown3}this is the second test \\
		               & \tt\small\color{SteelBlue3}grabbing heap string... \\
	\end{tabular*}

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

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

	\begin{tabular*}{\textwidth}{r@{\ \tt\bf :: }l}
		\tt\bf\small 1 & \tt\small \color{Brown3}description of the first test \\
	\end{tabular*}
	
	\myhl{\tt\small\textbf{FAIL: error message shown on failing}}
	
	\begin{tabular*}{\textwidth}{r@{\ }l}
		\tt\bf\small\color{Green3} expected: & \tt\small 6 \\
		\tt\bf\small\color{Red1} actual:     & \tt\small 0 \\
	\end{tabular*}

	\vspace{8pt}
	\hrule

	\pagebreak

	\myheading{defined macros}
	\begin{tabularx}{\textwidth}{r@{\ }X}
		\myrow{EXPECT\_ZERO(summary, arg)}{
			fail if \texttt{arg} does not resolve to 0
		}
		\myrow{EXPECT\_ONE(summary, arg)}{
			fail if \texttt{arg} does not resolve to 1
		}
		\myrow{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.
		}
		\myrow{EXPECT\_INT(summary, arg1, arg2)}{
			fail if \texttt{arg2} does not match the
			expected integer value \texttt{arg1}
		}
		\myrow{EXPECT\_EQUAL\_INT(summary, arg1, arg2)}{
			fail if \texttt{arg1} and \texttt{arg2} are
			not equal
		}
		\myrow{EXPECT\_UNEQUAL\_INT(summary, arg1, arg2)}{
			fail if \texttt{arg1} and \texttt{arg2} are
			equal
		}
		\myrow{EXPECT\_STR(summary, arg1, arg2)}{
			fail if string \texttt{arg2} does not match the
			expected string value \texttt{arg1}
		}
		\myrow{EXPECT\_EQUAL\_STR(summary, arg1, arg2)}{
			fail if \texttt{arg1} and \texttt{arg2} are
			not equivalent strings
		}
		\myrow{EXPECT\_UNEQUAL\_STR(summary, arg1, arg2)}{
			fail if \texttt{arg1} and \texttt{arg2} are
			equivalent strings
		}
	\end{tabularx}

\end{document}

