\myheading{Unit test: HTML/CSS color}
The most popular ways to represent HTML/CSS color is by English name (e.g., ``red'')
and by 6-digit hexadecimal number (e.g., ``\#0077CC'').
There is a third, less popular way: if each byte in hexadecimal number has two doubling digits,
it can be \emph{abbreviated}, thus,
``\#0077CC'' can be written just as ``\#07C''.
Let's write a function that identify a way of color encoding.
1) color name (if possible, first priority);
2) 3-digit hexadecimal form (if possible, second priority);
3) or as 6-digit hexadecimal form (as a last resort).
\lstinputlisting{KLEE/color.c}
There are 6 possible paths in function, and let's see, if KLEE could find them all?
It's indeed so:
\begin{lstlisting}
% clang -emit-llvm -c -g -O0 -Xclang -disable-O0-optnone -I /tmp/klee_src/include/klee/ color.c
% klee --libc=uclibc --optimize color.bc
...
KLEE: done: total instructions = 12232
KLEE: done: completed paths = 8
KLEE: done: partially completed paths = 0
KLEE: done: generated tests = 8
...
\end{lstlisting}
So there are 8 paths:
\begin{lstlisting}
% ls klee-last
assembly.ll run.istats test000001.ktest test000004.ktest test000007.ktest
info run.stats test000002.ktest test000005.ktest test000008.ktest
messages.txt solver-queries.smt2 test000003.ktest test000006.ktest warnings.txt
\end{lstlisting}
Let's list all 8 test cases:
\begin{lstlisting}
% ktest-tool klee-last/test000001.ktest | grep hex
object 0: hex : 0x00
object 1: hex : 0x00
object 2: hex : 0x00
% ktest-tool klee-last/test000002.ktest | grep hex
object 0: hex : 0xff
object 1: hex : 0x00
object 2: hex : 0x00
% ktest-tool klee-last/test000003.ktest | grep hex
object 0: hex : 0x00
object 1: hex : 0xff
object 2: hex : 0x00
% ktest-tool klee-last/test000004.ktest | grep hex
object 0: hex : 0x00
object 1: hex : 0x00
object 2: hex : 0xff
% ktest-tool klee-last/test000005.ktest | grep hex
object 0: hex : 0x01
object 1: hex : 0x01
object 2: hex : 0x01
% ktest-tool klee-last/test000006.ktest | grep hex
object 0: hex : 0x00
object 1: hex : 0x00
object 2: hex : 0x01
% ktest-tool klee-last/test000007.ktest | grep hex
object 0: hex : 0x00
object 1: hex : 0x01
object 2: hex : 0x00
% ktest-tool klee-last/test000008.ktest | grep hex
object 0: hex : 0x11
object 1: hex : 0x00
object 2: hex : 0x00
\end{lstlisting}
1st test for black, 2nd/3rd/4th tests --- red/green/blue.
5th/6th/7th tests --- \emph{full} 6-nibble hex code.
8th test --- \emph{abbreviated} 3-nibble hex code.
The test set could be a bit shorter (6 against 8), but this is not bad too.