").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA
=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b
+})}})(window);
diff --git a/visualtest/docs/html/linux__process_8c.html b/visualtest/docs/html/linux__process_8c.html
new file mode 100755
index 000000000..fa15ec913
--- /dev/null
+++ b/visualtest/docs/html/linux__process_8c.html
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/linux/linux_process.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL.h>
+
#include <SDL_test.h>
+
#include <sys/types.h>
+
#include <sys/wait.h>
+
#include <unistd.h>
+
#include <errno.h>
+
#include "SDL_visualtest_process.h "
+
#include "SDL_visualtest_harness_argparser.h "
+
#include "SDL_visualtest_parsehelper.h "
+
+
Source file for the process API on linux.
+
+
+
+
+
diff --git a/visualtest/docs/html/mischelper_8c.html b/visualtest/docs/html/mischelper_8c.html
new file mode 100755
index 000000000..18fbc3fc3
--- /dev/null
+++ b/visualtest/docs/html/mischelper_8c.html
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/mischelper.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_test.h>
+
+
+
Header with miscellaneous helper functions.
+
Source file with miscellaneous helper functions.
+
+
+
+
+
+
+ void SDLVisualTest_HashString
+ (
+ char *
+ str ,
+
+
+
+
+ char
+ hash [33]
+
+
+
+ )
+
+
+
+
+
Stores a 32 digit hexadecimal string representing the MD5 hash of the string str
in hash
.
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/nav_f.png b/visualtest/docs/html/nav_f.png
new file mode 100755
index 000000000..72a58a529
Binary files /dev/null and b/visualtest/docs/html/nav_f.png differ
diff --git a/visualtest/docs/html/nav_g.png b/visualtest/docs/html/nav_g.png
new file mode 100755
index 000000000..2093a237a
Binary files /dev/null and b/visualtest/docs/html/nav_g.png differ
diff --git a/visualtest/docs/html/nav_h.png b/visualtest/docs/html/nav_h.png
new file mode 100755
index 000000000..33389b101
Binary files /dev/null and b/visualtest/docs/html/nav_h.png differ
diff --git a/visualtest/docs/html/open.png b/visualtest/docs/html/open.png
new file mode 100755
index 000000000..30f75c7ef
Binary files /dev/null and b/visualtest/docs/html/open.png differ
diff --git a/visualtest/docs/html/parsehelper_8c.html b/visualtest/docs/html/parsehelper_8c.html
new file mode 100755
index 000000000..2b863cbc7
--- /dev/null
+++ b/visualtest/docs/html/parsehelper_8c.html
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/parsehelper.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_test.h>
+
#include "SDL_visualtest_harness_argparser.h "
+
+
+
Source file with some helper functions for parsing strings.
+
+
+
+
+
+
+ char** SDLVisualTest_ParseArgsToArgv
+ (
+ char *
+ args )
+
+
+
+
+
Takes an string of command line arguments and breaks them up into an array based on whitespace.
+
Parameters
+
+ args The string of arguments.
+
+
+
+
Returns NULL on failure, an array of strings on success. The last element of the array is NULL. The first element of the array is NULL and should be set to the path of the executable by the caller.
+
+
+
+
+
+
+
+
+ char** SDLVisualTest_Tokenize
+ (
+ char *
+ str ,
+
+
+
+
+ int
+ max_token_len
+
+
+
+ )
+
+
+
+
+
Takes a string and breaks it into tokens by splitting on whitespace.
+
Parameters
+
+ str The string to be split.
+ max_token_len Length of each element in the array to be returned.
+
+
+
+
Returns NULL on failure; an array of strings with the tokens on success. The last element of the array is NULL.
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/rwhelper_8c.html b/visualtest/docs/html/rwhelper_8c.html
new file mode 100755
index 000000000..417d79e9e
--- /dev/null
+++ b/visualtest/docs/html/rwhelper_8c.html
@@ -0,0 +1,244 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/rwhelper.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_test.h>
+
#include "SDL_visualtest_sut_configparser.h "
+
#include "SDL_visualtest_rwhelper.h"
+
+
+
Header file with some helper functions for working with SDL_RWops.
+
Source file with some helper functions for working with SDL_RWops.
+
+
+
+
+
+
+ int SDLVisualTest_RWHelperCountNonEmptyLines
+ (
+ SDL_RWops *
+ rw ,
+
+
+
+
+ SDLVisualTest_RWHelperBuffer *
+ buffer ,
+
+
+
+
+ char
+ comment_char
+
+
+
+ )
+
+
+
+
+
Counts the number of lines that are not all whitespace and comments using the SDL_RWops object pointed to by rw
. comment_char
indicates the character used for comments. Uses the buffer pointed to by buffer
to read data in blocks.
+
Returns Number of lines on success, -1 on failure.
+
+
+
+
+
+
+
Reads a single character using the SDL_RWops object pointed to by rw
. This function reads data in blocks and stores them in the buffer pointed to by buffer
, so other SDL_RWops functions should not be used in conjunction with this function.
+
Returns The character that was read.
+
+
+
+
+
+
+
+
+ char* SDLVisualTest_RWHelperReadLine
+ (
+ SDL_RWops *
+ rw ,
+
+
+
+
+ char *
+ str ,
+
+
+
+
+ int
+ size ,
+
+
+
+
+ SDLVisualTest_RWHelperBuffer *
+ buffer ,
+
+
+
+
+ char
+ comment_char
+
+
+
+ )
+
+
+
+
+
Reads characters using the SDL_RWops object pointed to by rw
into the character array pointed to by str
(of size size
) until either the array is full or a new line is encountered. If comment_char
is encountered, all characters from that position till the end of the line are ignored. The new line is not included as part of the buffer. Lines with only whitespace and comments are ignored. This function reads data in blocks and stores them in the buffer pointed to by buffer
, so other SDL_RWops functions should not be used in conjunction with this function.
+
Returns pointer to the string on success, NULL on failure or EOF.
+
+
+
+
+
+
+
Resets the buffer pointed to by buffer
used by some of the helper functions. This function should be called when you're using one of the helper functions with a new SDL_RWops object.
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/screenshot_8c.html b/visualtest/docs/html/screenshot_8c.html
new file mode 100755
index 000000000..2ff802941
--- /dev/null
+++ b/visualtest/docs/html/screenshot_8c.html
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/screenshot.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include "SDL_visualtest_mischelper.h"
+#include <SDL_test.h>
+
+
+
Source file for the screenshot API.
+
+
+
+
+
+
+ int SDLVisualTest_VerifyScreenshots
+ (
+ char *
+ args ,
+
+
+
+
+ char *
+ test_dir ,
+
+
+
+
+ char *
+ verify_dir
+
+
+
+ )
+
+
+
+
+
Compare a screenshot taken previously with SUT arguments args
that is located in test_dir
with a verification image that is located in verify_dir
.
+
Returns -1 on failure, 0 if the images were not equal, 1 if the images are equal and 2 if the verification image is not present.
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/search/all_61.html b/visualtest/docs/html/search/all_61.html
new file mode 100755
index 000000000..a78c8f988
--- /dev/null
+++ b/visualtest/docs/html/search/all_61.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_61.js b/visualtest/docs/html/search/all_61.js
new file mode 100755
index 000000000..321716292
--- /dev/null
+++ b/visualtest/docs/html/search/all_61.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['action',['action',['../struct_s_d_l_visual_test___action_node.html#af46ec45094cc74a7432626a6234c6575',1,'SDLVisualTest_ActionNode']]],
+ ['action_5fconfigparser_2ec',['action_configparser.c',['../action__configparser_8c.html',1,'']]],
+ ['action_5floop_5ffps',['ACTION_LOOP_FPS',['../testharness_8c.html#a70102426e83ed3944f9c060bd82fb54e',1,'testharness.c']]],
+ ['action_5fqueue',['action_queue',['../struct_s_d_l_visual_test___harness_state.html#ae25567527563fbd7373fa1cf7cdede61',1,'SDLVisualTest_HarnessState']]],
+ ['action_5ftimer_5fevent',['ACTION_TIMER_EVENT',['../testharness_8c.html#a0d1d5d1394089a10f0147ed2b89c1165',1,'testharness.c']]]
+];
diff --git a/visualtest/docs/html/search/all_62.html b/visualtest/docs/html/search/all_62.html
new file mode 100755
index 000000000..29fe20787
--- /dev/null
+++ b/visualtest/docs/html/search/all_62.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_62.js b/visualtest/docs/html/search/all_62.js
new file mode 100755
index 000000000..d614f7b3f
--- /dev/null
+++ b/visualtest/docs/html/search/all_62.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['bool_5fvalue',['bool_value',['../union_s_d_l_visual_test___s_u_t_option_value.html#ace8ec6519c056e35443a6c401f3d0941',1,'SDLVisualTest_SUTOptionValue']]],
+ ['buffer',['buffer',['../struct_s_d_l_visual_test___exhaustive_variator.html#a2b599af5b00be0f525ffc18feb0775a8',1,'SDLVisualTest_ExhaustiveVariator::buffer()'],['../struct_s_d_l_visual_test___random_variator.html#a2b599af5b00be0f525ffc18feb0775a8',1,'SDLVisualTest_RandomVariator::buffer()'],['../struct_s_d_l_visual_test___r_w_helper_buffer.html#a5b528063c1aaa0e626f5d5e49de5baad',1,'SDLVisualTest_RWHelperBuffer::buffer()']]],
+ ['buffer_5fpos',['buffer_pos',['../struct_s_d_l_visual_test___r_w_helper_buffer.html#a8a37d41b7b076eced766d7418450477d',1,'SDLVisualTest_RWHelperBuffer']]],
+ ['buffer_5fwidth',['buffer_width',['../struct_s_d_l_visual_test___r_w_helper_buffer.html#adb2920cd89b7b8b8b014290e82746d8c',1,'SDLVisualTest_RWHelperBuffer']]]
+];
diff --git a/visualtest/docs/html/search/all_63.html b/visualtest/docs/html/search/all_63.html
new file mode 100755
index 000000000..a46f89492
--- /dev/null
+++ b/visualtest/docs/html/search/all_63.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_63.js b/visualtest/docs/html/search/all_63.js
new file mode 100755
index 000000000..dcc5243ac
--- /dev/null
+++ b/visualtest/docs/html/search/all_63.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['categories',['categories',['../struct_s_d_l_visual_test___s_u_t_option.html#a6744d43d3ad17d06068dba9ee7b78c83',1,'SDLVisualTest_SUTOption']]],
+ ['config',['config',['../struct_s_d_l_visual_test___exhaustive_variator.html#ab66b4220589b2e2b6e1fde7d6c20bd72',1,'SDLVisualTest_ExhaustiveVariator::config()'],['../struct_s_d_l_visual_test___random_variator.html#ab66b4220589b2e2b6e1fde7d6c20bd72',1,'SDLVisualTest_RandomVariator::config()']]]
+];
diff --git a/visualtest/docs/html/search/all_64.html b/visualtest/docs/html/search/all_64.html
new file mode 100755
index 000000000..648250151
--- /dev/null
+++ b/visualtest/docs/html/search/all_64.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_64.js b/visualtest/docs/html/search/all_64.js
new file mode 100755
index 000000000..5ab8d3464
--- /dev/null
+++ b/visualtest/docs/html/search/all_64.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['data',['data',['../struct_s_d_l_visual_test___s_u_t_option.html#aa9545bd4acd476f61533d04d53cdffdc',1,'SDLVisualTest_SUTOption::data()'],['../struct_s_d_l_visual_test___variator.html#af99a8790e729d599c656a2070e672e9a',1,'SDLVisualTest_Variator::data()']]],
+ ['default_5fsut_5ftimeout',['DEFAULT_SUT_TIMEOUT',['../harness__argparser_8c.html#a6669f8e5a07e7a0e4622dd23362831e7',1,'harness_argparser.c']]]
+];
diff --git a/visualtest/docs/html/search/all_65.html b/visualtest/docs/html/search/all_65.html
new file mode 100755
index 000000000..9004138c3
--- /dev/null
+++ b/visualtest/docs/html/search/all_65.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_65.js b/visualtest/docs/html/search/all_65.js
new file mode 100755
index 000000000..f1c225b11
--- /dev/null
+++ b/visualtest/docs/html/search/all_65.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['enum_5fvalues',['enum_values',['../struct_s_d_l_visual_test___s_u_t_option.html#a596ff3567c4b736561dba1915a2cd38d',1,'SDLVisualTest_SUTOption']]],
+ ['enumerated',['enumerated',['../union_s_d_l_visual_test___s_u_t_option_value.html#ad40e26afd4b8532327b61897d5b009e3',1,'SDLVisualTest_SUTOptionValue']]],
+ ['exit_5fstatus',['exit_status',['../struct_s_d_l___process_exit_status.html#a9324a9ff7dc6697dd77f02998d5e77d7',1,'SDL_ProcessExitStatus']]],
+ ['exit_5fsuccess',['exit_success',['../struct_s_d_l___process_exit_status.html#a51df50c07437f2e816d6ce7ce99e1cac',1,'SDL_ProcessExitStatus']]],
+ ['extra',['extra',['../struct_s_d_l_visual_test___action.html#a4626514a67f261290b54fb3d85ca8ddd',1,'SDLVisualTest_Action']]]
+];
diff --git a/visualtest/docs/html/search/all_66.html b/visualtest/docs/html/search/all_66.html
new file mode 100755
index 000000000..5e2635f6c
--- /dev/null
+++ b/visualtest/docs/html/search/all_66.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_66.js b/visualtest/docs/html/search/all_66.js
new file mode 100755
index 000000000..d89c38030
--- /dev/null
+++ b/visualtest/docs/html/search/all_66.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['front',['front',['../struct_s_d_l_visual_test___action_queue.html#a8b810b2fd2b05698be642ee08836a452',1,'SDLVisualTest_ActionQueue']]]
+];
diff --git a/visualtest/docs/html/search/all_68.html b/visualtest/docs/html/search/all_68.html
new file mode 100755
index 000000000..2db11df90
--- /dev/null
+++ b/visualtest/docs/html/search/all_68.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_68.js b/visualtest/docs/html/search/all_68.js
new file mode 100755
index 000000000..c2615b10c
--- /dev/null
+++ b/visualtest/docs/html/search/all_68.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['harness_5fargparser_2ec',['harness_argparser.c',['../harness__argparser_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/all_69.html b/visualtest/docs/html/search/all_69.html
new file mode 100755
index 000000000..b8c830610
--- /dev/null
+++ b/visualtest/docs/html/search/all_69.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_69.js b/visualtest/docs/html/search/all_69.js
new file mode 100755
index 000000000..d88f651d5
--- /dev/null
+++ b/visualtest/docs/html/search/all_69.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['integer',['integer',['../union_s_d_l_visual_test___s_u_t_option_value.html#a4291d9ad3cfb3fe1645ea2732e11d68a',1,'SDLVisualTest_SUTOptionValue']]]
+];
diff --git a/visualtest/docs/html/search/all_6b.html b/visualtest/docs/html/search/all_6b.html
new file mode 100755
index 000000000..f4b97caa7
--- /dev/null
+++ b/visualtest/docs/html/search/all_6b.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_6b.js b/visualtest/docs/html/search/all_6b.js
new file mode 100755
index 000000000..831fa2c4e
--- /dev/null
+++ b/visualtest/docs/html/search/all_6b.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['kill_5ftimer_5fevent',['KILL_TIMER_EVENT',['../testharness_8c.html#acdc6cb4935ca89fbe3fda31a8f533b9a',1,'testharness.c']]]
+];
diff --git a/visualtest/docs/html/search/all_6c.html b/visualtest/docs/html/search/all_6c.html
new file mode 100755
index 000000000..131c91938
--- /dev/null
+++ b/visualtest/docs/html/search/all_6c.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_6c.js b/visualtest/docs/html/search/all_6c.js
new file mode 100755
index 000000000..f6a1353d1
--- /dev/null
+++ b/visualtest/docs/html/search/all_6c.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['linux_5fprocess_2ec',['linux_process.c',['../linux__process_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/all_6d.html b/visualtest/docs/html/search/all_6d.html
new file mode 100755
index 000000000..650f0402c
--- /dev/null
+++ b/visualtest/docs/html/search/all_6d.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_6d.js b/visualtest/docs/html/search/all_6d.js
new file mode 100755
index 000000000..bda2e469f
--- /dev/null
+++ b/visualtest/docs/html/search/all_6d.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+ ['main',['main',['../testharness_8c.html#a0ddf1224851353fc92bfbff6f499fa97',1,'testharness.c']]],
+ ['max',['max',['../struct_s_d_l_visual_test___s_u_t_int_range.html#ae1e1dde676c120fa6d10f3bb2c14059e',1,'SDLVisualTest_SUTIntRange']]],
+ ['max_5faction_5fline_5flength',['MAX_ACTION_LINE_LENGTH',['../_s_d_l__visualtest__action__configparser_8h.html#a19244c2e1556665be344807ace1556ed',1,'SDL_visualtest_action_configparser.h']]],
+ ['max_5fconfig_5fline_5flen',['MAX_CONFIG_LINE_LEN',['../harness__argparser_8c.html#a7186273cd88640b740b6333cd98ae243',1,'harness_argparser.c']]],
+ ['max_5fpath_5flen',['MAX_PATH_LEN',['../_s_d_l__visualtest__harness__argparser_8h.html#abdd33f362ae3bbdacb5de76473aa8a2f',1,'SDL_visualtest_harness_argparser.h']]],
+ ['max_5fsut_5fargs_5flen',['MAX_SUT_ARGS_LEN',['../_s_d_l__visualtest__harness__argparser_8h.html#a8485cbda108eca56406d67aaa685fcc5',1,'SDL_visualtest_harness_argparser.h']]],
+ ['max_5fsutoption_5fcategory_5flen',['MAX_SUTOPTION_CATEGORY_LEN',['../_s_d_l__visualtest__sut__configparser_8h.html#a21a678ced8cdf55b4cc70ad398bf33b6',1,'SDL_visualtest_sut_configparser.h']]],
+ ['max_5fsutoption_5fenumval_5flen',['MAX_SUTOPTION_ENUMVAL_LEN',['../_s_d_l__visualtest__sut__configparser_8h.html#a6c700fc8ff02cfa0c795b9593f86b9a0',1,'SDL_visualtest_sut_configparser.h']]],
+ ['max_5fsutoption_5fline_5flength',['MAX_SUTOPTION_LINE_LENGTH',['../_s_d_l__visualtest__sut__configparser_8h.html#a8f1a5749af5a592b30a194c72d848f75',1,'SDL_visualtest_sut_configparser.h']]],
+ ['max_5fsutoption_5fname_5flen',['MAX_SUTOPTION_NAME_LEN',['../_s_d_l__visualtest__sut__configparser_8h.html#a0a8b0c1f8eee787abf09bf3a840eccc7',1,'SDL_visualtest_sut_configparser.h']]],
+ ['min',['min',['../struct_s_d_l_visual_test___s_u_t_int_range.html#a3e202b201e6255d975cd6d3aff1f5a4d',1,'SDLVisualTest_SUTIntRange']]],
+ ['mischelper_2ec',['mischelper.c',['../mischelper_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/all_6e.html b/visualtest/docs/html/search/all_6e.html
new file mode 100755
index 000000000..114330ba5
--- /dev/null
+++ b/visualtest/docs/html/search/all_6e.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_6e.js b/visualtest/docs/html/search/all_6e.js
new file mode 100755
index 000000000..7f7530572
--- /dev/null
+++ b/visualtest/docs/html/search/all_6e.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['name',['name',['../struct_s_d_l_visual_test___s_u_t_option.html#ad14ca616d8f7c9b61eff58baaead7f1f',1,'SDLVisualTest_SUTOption']]],
+ ['next',['next',['../struct_s_d_l_visual_test___action_node.html#ae6154b60b896ce1a184d060ee4664485',1,'SDLVisualTest_ActionNode']]],
+ ['no_5flaunch',['no_launch',['../struct_s_d_l_visual_test___harness_state.html#a091c0d08290b73216a736ff42ac8fa99',1,'SDLVisualTest_HarnessState']]],
+ ['num_5foptions',['num_options',['../struct_s_d_l_visual_test___s_u_t_config.html#a593108c2cc4b7dd3edecefd724edfd51',1,'SDLVisualTest_SUTConfig']]],
+ ['num_5fvariations',['num_variations',['../struct_s_d_l_visual_test___harness_state.html#a0bd4e04c0c6be7b94e68501bb31dd62c',1,'SDLVisualTest_HarnessState']]],
+ ['num_5fvars',['num_vars',['../struct_s_d_l_visual_test___variation.html#a2daded0b80f9ab7ed3703cc2686e5a92',1,'SDLVisualTest_Variation']]]
+];
diff --git a/visualtest/docs/html/search/all_6f.html b/visualtest/docs/html/search/all_6f.html
new file mode 100755
index 000000000..958ab689d
--- /dev/null
+++ b/visualtest/docs/html/search/all_6f.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_6f.js b/visualtest/docs/html/search/all_6f.js
new file mode 100755
index 000000000..35f6f8542
--- /dev/null
+++ b/visualtest/docs/html/search/all_6f.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['options',['options',['../struct_s_d_l_visual_test___s_u_t_config.html#afda1bef370f3d5ea6919b7b6a73d01c0',1,'SDLVisualTest_SUTConfig']]],
+ ['output_5fdir',['output_dir',['../struct_s_d_l_visual_test___harness_state.html#aafa9a2fb15490380b6c2edd704f4fcf0',1,'SDLVisualTest_HarnessState']]]
+];
diff --git a/visualtest/docs/html/search/all_70.html b/visualtest/docs/html/search/all_70.html
new file mode 100755
index 000000000..a28cb5466
--- /dev/null
+++ b/visualtest/docs/html/search/all_70.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_70.js b/visualtest/docs/html/search/all_70.js
new file mode 100755
index 000000000..38c5827e2
--- /dev/null
+++ b/visualtest/docs/html/search/all_70.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['parsehelper_2ec',['parsehelper.c',['../parsehelper_8c.html',1,'']]],
+ ['process',['process',['../struct_s_d_l_visual_test___action.html#aa43e9883c9f24718f49b984b67b1afdc',1,'SDLVisualTest_Action']]]
+];
diff --git a/visualtest/docs/html/search/all_72.html b/visualtest/docs/html/search/all_72.html
new file mode 100755
index 000000000..d03b8a575
--- /dev/null
+++ b/visualtest/docs/html/search/all_72.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_72.js b/visualtest/docs/html/search/all_72.js
new file mode 100755
index 000000000..2216614a4
--- /dev/null
+++ b/visualtest/docs/html/search/all_72.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['range',['range',['../struct_s_d_l_visual_test___s_u_t_option.html#a2bb1301268866e0e41d035ea0a4914e8',1,'SDLVisualTest_SUTOption']]],
+ ['rear',['rear',['../struct_s_d_l_visual_test___action_queue.html#a4aaf4563956932c81c65d05f9020f2ce',1,'SDLVisualTest_ActionQueue']]],
+ ['required',['required',['../struct_s_d_l_visual_test___s_u_t_option.html#a79305c1b10f7b4defee52e1eefde8fbc',1,'SDLVisualTest_SUTOption']]],
+ ['rwhelper_2ec',['rwhelper.c',['../rwhelper_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/all_73.html b/visualtest/docs/html/search/all_73.html
new file mode 100755
index 000000000..a15b975fd
--- /dev/null
+++ b/visualtest/docs/html/search/all_73.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_73.js b/visualtest/docs/html/search/all_73.js
new file mode 100755
index 000000000..50733e93b
--- /dev/null
+++ b/visualtest/docs/html/search/all_73.js
@@ -0,0 +1,83 @@
+var searchData=
+[
+ ['screenshot_2ec',['screenshot.c',['../screenshot_8c.html',1,'']]],
+ ['sdl_5faction_5fkill',['SDL_ACTION_KILL',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6a87880c4f665344d4c3e12f9aa3af7410',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdl_5faction_5flaunch',['SDL_ACTION_LAUNCH',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6ac5344bca6af9c07c4ee69ee4c2b18df2',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdl_5faction_5fquit',['SDL_ACTION_QUIT',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6ad3d17a830b7e1e46e37d916130d8802a',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdl_5faction_5fscreenshot',['SDL_ACTION_SCREENSHOT',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6af9b5d42cb90bf843f298be4593992fdb',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdl_5faction_5fverify',['SDL_ACTION_VERIFY',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6a0853f8be8363015b822658b9f3b013f4',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdl_5fgetprocessexitstatus',['SDL_GetProcessExitStatus',['../_s_d_l__visualtest__process_8h.html#a54545d6b9f737a14030b4ce55ddd4a62',1,'SDL_visualtest_process.h']]],
+ ['sdl_5fisprocessrunning',['SDL_IsProcessRunning',['../_s_d_l__visualtest__process_8h.html#a3a131140a71bf68fa68a900f06872239',1,'SDL_visualtest_process.h']]],
+ ['sdl_5fkillprocess',['SDL_KillProcess',['../_s_d_l__visualtest__process_8h.html#ae66242e44a004831ab231693fd11c8d0',1,'SDL_visualtest_process.h']]],
+ ['sdl_5flaunchprocess',['SDL_LaunchProcess',['../_s_d_l__visualtest__process_8h.html#a12c16e5b870e2794d6bd5a1a3bb4582f',1,'SDL_visualtest_process.h']]],
+ ['sdl_5fprocessexitstatus',['SDL_ProcessExitStatus',['../struct_s_d_l___process_exit_status.html',1,'SDL_ProcessExitStatus'],['../_s_d_l__visualtest__process_8h.html#a5b7d5262f85e78bf4d53d88f3c509342',1,'SDL_ProcessExitStatus(): SDL_visualtest_process.h']]],
+ ['sdl_5fprocessinfo',['SDL_ProcessInfo',['../struct_s_d_l___process_info.html',1,'SDL_ProcessInfo'],['../_s_d_l__visualtest__process_8h.html#a94bc9e0b0b563a527ea50ef2eecd5402',1,'SDL_ProcessInfo(): SDL_visualtest_process.h']]],
+ ['sdl_5fquitprocess',['SDL_QuitProcess',['../_s_d_l__visualtest__process_8h.html#ad8a5b6725ad1f0e1bac623cf4b6fc28d',1,'SDL_visualtest_process.h']]],
+ ['sdl_5fsut_5finteger_5foption_5ftest_5fsteps',['SDL_SUT_INTEGER_OPTION_TEST_STEPS',['../_s_d_l__visualtest__variator__common_8h.html#afcdce86a10fbcdc9f3e47c47b70e3ea3',1,'SDL_visualtest_variator_common.h']]],
+ ['sdl_5fvisualtest_5faction_5fconfigparser_2eh',['SDL_visualtest_action_configparser.h',['../_s_d_l__visualtest__action__configparser_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fexhaustive_5fvariator_2eh',['SDL_visualtest_exhaustive_variator.h',['../_s_d_l__visualtest__exhaustive__variator_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fharness_5fargparser_2eh',['SDL_visualtest_harness_argparser.h',['../_s_d_l__visualtest__harness__argparser_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fparsehelper_2eh',['SDL_visualtest_parsehelper.h',['../_s_d_l__visualtest__parsehelper_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fprocess_2eh',['SDL_visualtest_process.h',['../_s_d_l__visualtest__process_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5frandom_5fvariator_2eh',['SDL_visualtest_random_variator.h',['../_s_d_l__visualtest__random__variator_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fscreenshot_2eh',['SDL_visualtest_screenshot.h',['../_s_d_l__visualtest__screenshot_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fsut_5fconfigparser_2eh',['SDL_visualtest_sut_configparser.h',['../_s_d_l__visualtest__sut__configparser_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fvariator_5fcommon_2eh',['SDL_visualtest_variator_common.h',['../_s_d_l__visualtest__variator__common_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fvariators_2eh',['SDL_visualtest_variators.h',['../_s_d_l__visualtest__variators_8h.html',1,'']]],
+ ['sdlvisualtest_5faction',['SDLVisualTest_Action',['../struct_s_d_l_visual_test___action.html',1,'SDLVisualTest_Action'],['../_s_d_l__visualtest__action__configparser_8h.html#a89974e9149bfca6aabb3ff06cc9671d7',1,'SDLVisualTest_Action(): SDL_visualtest_action_configparser.h']]],
+ ['sdlvisualtest_5factionnode',['SDLVisualTest_ActionNode',['../struct_s_d_l_visual_test___action_node.html',1,'SDLVisualTest_ActionNode'],['../_s_d_l__visualtest__action__configparser_8h.html#a065d1acf0f98bde777d10bd8ab24d268',1,'SDLVisualTest_ActionNode(): SDL_visualtest_action_configparser.h']]],
+ ['sdlvisualtest_5factionqueue',['SDLVisualTest_ActionQueue',['../struct_s_d_l_visual_test___action_queue.html',1,'SDLVisualTest_ActionQueue'],['../_s_d_l__visualtest__action__configparser_8h.html#ac9ce1bb69d8774d1818c9f9d0f97c7f1',1,'SDLVisualTest_ActionQueue(): SDL_visualtest_action_configparser.h']]],
+ ['sdlvisualtest_5factiontype',['SDLVisualTest_ActionType',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdlvisualtest_5fdequeueaction',['SDLVisualTest_DequeueAction',['../_s_d_l__visualtest__action__configparser_8h.html#a0e7998533e6e10590612a8d5dee7ec0b',1,'SDLVisualTest_DequeueAction(SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#a0e7998533e6e10590612a8d5dee7ec0b',1,'SDLVisualTest_DequeueAction(SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5femptyactionqueue',['SDLVisualTest_EmptyActionQueue',['../_s_d_l__visualtest__action__configparser_8h.html#a677da0d0e4793df342f91974b4559efa',1,'SDLVisualTest_EmptyActionQueue(SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#a677da0d0e4793df342f91974b4559efa',1,'SDLVisualTest_EmptyActionQueue(SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5fenqueueaction',['SDLVisualTest_EnqueueAction',['../_s_d_l__visualtest__action__configparser_8h.html#a647d1be8f0f27af2fb1e5d4da2100596',1,'SDLVisualTest_EnqueueAction(SDLVisualTest_ActionQueue *queue, SDLVisualTest_Action action): action_configparser.c'],['../action__configparser_8c.html#a647d1be8f0f27af2fb1e5d4da2100596',1,'SDLVisualTest_EnqueueAction(SDLVisualTest_ActionQueue *queue, SDLVisualTest_Action action): action_configparser.c']]],
+ ['sdlvisualtest_5fexhaustivevariator',['SDLVisualTest_ExhaustiveVariator',['../struct_s_d_l_visual_test___exhaustive_variator.html',1,'SDLVisualTest_ExhaustiveVariator'],['../_s_d_l__visualtest__exhaustive__variator_8h.html#ab64de6cf7d6a1e6d09d470c020940c25',1,'SDLVisualTest_ExhaustiveVariator(): SDL_visualtest_exhaustive_variator.h']]],
+ ['sdlvisualtest_5ffreeexhaustivevariator',['SDLVisualTest_FreeExhaustiveVariator',['../_s_d_l__visualtest__exhaustive__variator_8h.html#a7168b055fb86bbbb700d87ae842f7152',1,'SDLVisualTest_FreeExhaustiveVariator(SDLVisualTest_ExhaustiveVariator *variator): variator_exhaustive.c'],['../variator__exhaustive_8c.html#a7168b055fb86bbbb700d87ae842f7152',1,'SDLVisualTest_FreeExhaustiveVariator(SDLVisualTest_ExhaustiveVariator *variator): variator_exhaustive.c']]],
+ ['sdlvisualtest_5ffreeharnessstate',['SDLVisualTest_FreeHarnessState',['../_s_d_l__visualtest__harness__argparser_8h.html#a833147d8da541982c615645a797627cc',1,'SDLVisualTest_FreeHarnessState(SDLVisualTest_HarnessState *state): harness_argparser.c'],['../harness__argparser_8c.html#a833147d8da541982c615645a797627cc',1,'SDLVisualTest_FreeHarnessState(SDLVisualTest_HarnessState *state): harness_argparser.c']]],
+ ['sdlvisualtest_5ffreerandomvariator',['SDLVisualTest_FreeRandomVariator',['../_s_d_l__visualtest__random__variator_8h.html#ac95d9e0716e4c918c6902b10f9591d4b',1,'SDLVisualTest_FreeRandomVariator(SDLVisualTest_RandomVariator *variator): variator_random.c'],['../variator__random_8c.html#ac95d9e0716e4c918c6902b10f9591d4b',1,'SDLVisualTest_FreeRandomVariator(SDLVisualTest_RandomVariator *variator): variator_random.c']]],
+ ['sdlvisualtest_5ffreesutconfig',['SDLVisualTest_FreeSUTConfig',['../_s_d_l__visualtest__sut__configparser_8h.html#a1bddf9732c0d3ed1c24455d22193de9a',1,'SDLVisualTest_FreeSUTConfig(SDLVisualTest_SUTConfig *config): sut_configparser.c'],['../sut__configparser_8c.html#a1bddf9732c0d3ed1c24455d22193de9a',1,'SDLVisualTest_FreeSUTConfig(SDLVisualTest_SUTConfig *config): sut_configparser.c']]],
+ ['sdlvisualtest_5ffreevariator',['SDLVisualTest_FreeVariator',['../_s_d_l__visualtest__variators_8h.html#a98727ef649135c3312056d7603cb70b5',1,'SDLVisualTest_FreeVariator(SDLVisualTest_Variator *variator): variators.c'],['../variators_8c.html#a98727ef649135c3312056d7603cb70b5',1,'SDLVisualTest_FreeVariator(SDLVisualTest_Variator *variator): variators.c']]],
+ ['sdlvisualtest_5fgetnextexhaustivevariation',['SDLVisualTest_GetNextExhaustiveVariation',['../_s_d_l__visualtest__exhaustive__variator_8h.html#aa9e13a92945ef48308215b3fa068ed29',1,'SDLVisualTest_GetNextExhaustiveVariation(SDLVisualTest_ExhaustiveVariator *variator): variator_exhaustive.c'],['../variator__exhaustive_8c.html#aa9e13a92945ef48308215b3fa068ed29',1,'SDLVisualTest_GetNextExhaustiveVariation(SDLVisualTest_ExhaustiveVariator *variator): variator_exhaustive.c']]],
+ ['sdlvisualtest_5fgetnextrandomvariation',['SDLVisualTest_GetNextRandomVariation',['../_s_d_l__visualtest__random__variator_8h.html#a479aceb74b5355c1d22856fc7efce890',1,'SDLVisualTest_GetNextRandomVariation(SDLVisualTest_RandomVariator *variator): variator_random.c'],['../variator__random_8c.html#a479aceb74b5355c1d22856fc7efce890',1,'SDLVisualTest_GetNextRandomVariation(SDLVisualTest_RandomVariator *variator): variator_random.c']]],
+ ['sdlvisualtest_5fgetnextvariation',['SDLVisualTest_GetNextVariation',['../_s_d_l__visualtest__variators_8h.html#aebdd4c3c545b0063d16929fd56f1a79f',1,'SDLVisualTest_GetNextVariation(SDLVisualTest_Variator *variator): variators.c'],['../variators_8c.html#aebdd4c3c545b0063d16929fd56f1a79f',1,'SDLVisualTest_GetNextVariation(SDLVisualTest_Variator *variator): variators.c']]],
+ ['sdlvisualtest_5fgetqueuefront',['SDLVisualTest_GetQueueFront',['../_s_d_l__visualtest__action__configparser_8h.html#afb508801942e7c74084480bcdb6f8613',1,'SDLVisualTest_GetQueueFront(SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#afb508801942e7c74084480bcdb6f8613',1,'SDLVisualTest_GetQueueFront(SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5fharnessstate',['SDLVisualTest_HarnessState',['../struct_s_d_l_visual_test___harness_state.html',1,'SDLVisualTest_HarnessState'],['../_s_d_l__visualtest__harness__argparser_8h.html#ab89725ad0ec988d4923faa6a85972455',1,'SDLVisualTest_HarnessState(): SDL_visualtest_harness_argparser.h']]],
+ ['sdlvisualtest_5fhashstring',['SDLVisualTest_HashString',['../mischelper_8c.html#a0dae46cdb4e58bdda78676260eaaf980',1,'mischelper.c']]],
+ ['sdlvisualtest_5finitactionqueue',['SDLVisualTest_InitActionQueue',['../_s_d_l__visualtest__action__configparser_8h.html#ae68c1c80f728e125869882139bec2c9e',1,'SDLVisualTest_InitActionQueue(SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#ae68c1c80f728e125869882139bec2c9e',1,'SDLVisualTest_InitActionQueue(SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5finitexhaustivevariator',['SDLVisualTest_InitExhaustiveVariator',['../_s_d_l__visualtest__exhaustive__variator_8h.html#a9e213e530ddf5a18014786d10e9fdaee',1,'SDLVisualTest_InitExhaustiveVariator(SDLVisualTest_ExhaustiveVariator *variator, SDLVisualTest_SUTConfig *config): variator_exhaustive.c'],['../variator__exhaustive_8c.html#a9e213e530ddf5a18014786d10e9fdaee',1,'SDLVisualTest_InitExhaustiveVariator(SDLVisualTest_ExhaustiveVariator *variator, SDLVisualTest_SUTConfig *config): variator_exhaustive.c']]],
+ ['sdlvisualtest_5finitrandomvariator',['SDLVisualTest_InitRandomVariator',['../_s_d_l__visualtest__random__variator_8h.html#a807486069b7180c3b3bf8af4616d055f',1,'SDLVisualTest_InitRandomVariator(SDLVisualTest_RandomVariator *variator, SDLVisualTest_SUTConfig *config, Uint64 seed): variator_random.c'],['../variator__random_8c.html#a807486069b7180c3b3bf8af4616d055f',1,'SDLVisualTest_InitRandomVariator(SDLVisualTest_RandomVariator *variator, SDLVisualTest_SUTConfig *config, Uint64 seed): variator_random.c']]],
+ ['sdlvisualtest_5finitvariation',['SDLVisualTest_InitVariation',['../_s_d_l__visualtest__variator__common_8h.html#ac87934906c51364778dc910ebca47b6c',1,'SDLVisualTest_InitVariation(SDLVisualTest_Variation *variation, SDLVisualTest_SUTConfig *config): variator_common.c'],['../variator__common_8c.html#ac87934906c51364778dc910ebca47b6c',1,'SDLVisualTest_InitVariation(SDLVisualTest_Variation *variation, SDLVisualTest_SUTConfig *config): variator_common.c']]],
+ ['sdlvisualtest_5finitvariator',['SDLVisualTest_InitVariator',['../_s_d_l__visualtest__variators_8h.html#ac1d82ee387a19743e47a82c87d3fb7f4',1,'SDLVisualTest_InitVariator(SDLVisualTest_Variator *variator, SDLVisualTest_SUTConfig *config, SDLVisualTest_VariatorType type, Uint64 seed): variators.c'],['../variators_8c.html#ac1d82ee387a19743e47a82c87d3fb7f4',1,'SDLVisualTest_InitVariator(SDLVisualTest_Variator *variator, SDLVisualTest_SUTConfig *config, SDLVisualTest_VariatorType type, Uint64 seed): variators.c']]],
+ ['sdlvisualtest_5finsertintoactionqueue',['SDLVisualTest_InsertIntoActionQueue',['../_s_d_l__visualtest__action__configparser_8h.html#ace5374ef7509e95383929ff185aaf7e6',1,'SDLVisualTest_InsertIntoActionQueue(SDLVisualTest_ActionQueue *queue, SDLVisualTest_Action action): action_configparser.c'],['../action__configparser_8c.html#ace5374ef7509e95383929ff185aaf7e6',1,'SDLVisualTest_InsertIntoActionQueue(SDLVisualTest_ActionQueue *queue, SDLVisualTest_Action action): action_configparser.c']]],
+ ['sdlvisualtest_5fisactionqueueempty',['SDLVisualTest_IsActionQueueEmpty',['../_s_d_l__visualtest__action__configparser_8h.html#a8484ee36f78952192d4193c85fca2f17',1,'SDLVisualTest_IsActionQueueEmpty(SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#a8484ee36f78952192d4193c85fca2f17',1,'SDLVisualTest_IsActionQueueEmpty(SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5fmakestrfromvariation',['SDLVisualTest_MakeStrFromVariation',['../_s_d_l__visualtest__variator__common_8h.html#ad981c2efab849e76dc878ef8da9d6017',1,'SDLVisualTest_MakeStrFromVariation(SDLVisualTest_Variation *variation, SDLVisualTest_SUTConfig *config, char *buffer, int size): variator_common.c'],['../variator__common_8c.html#ad981c2efab849e76dc878ef8da9d6017',1,'SDLVisualTest_MakeStrFromVariation(SDLVisualTest_Variation *variation, SDLVisualTest_SUTConfig *config, char *buffer, int size): variator_common.c']]],
+ ['sdlvisualtest_5fnextvalue',['SDLVisualTest_NextValue',['../_s_d_l__visualtest__variator__common_8h.html#aafcecc06c8feb24b6f6a509bfa9db681',1,'SDLVisualTest_NextValue(SDLVisualTest_SUTOptionValue *var, SDLVisualTest_SUTOption *opt): variator_common.c'],['../variator__common_8c.html#aafcecc06c8feb24b6f6a509bfa9db681',1,'SDLVisualTest_NextValue(SDLVisualTest_SUTOptionValue *var, SDLVisualTest_SUTOption *opt): variator_common.c']]],
+ ['sdlvisualtest_5fparseactionconfig',['SDLVisualTest_ParseActionConfig',['../_s_d_l__visualtest__action__configparser_8h.html#a8ef9dce4d464d6994596deeace6ffa2d',1,'SDLVisualTest_ParseActionConfig(char *file, SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#a8ef9dce4d464d6994596deeace6ffa2d',1,'SDLVisualTest_ParseActionConfig(char *file, SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5fparseargstoargv',['SDLVisualTest_ParseArgsToArgv',['../_s_d_l__visualtest__parsehelper_8h.html#a5f168fdd02f9d40ddbad97bd8c0b6361',1,'SDLVisualTest_ParseArgsToArgv(char *args): parsehelper.c'],['../parsehelper_8c.html#a5f168fdd02f9d40ddbad97bd8c0b6361',1,'SDLVisualTest_ParseArgsToArgv(char *args): parsehelper.c']]],
+ ['sdlvisualtest_5fparseharnessargs',['SDLVisualTest_ParseHarnessArgs',['../_s_d_l__visualtest__harness__argparser_8h.html#a629609acc04ef21a21fdfbbf6c1589c8',1,'SDLVisualTest_ParseHarnessArgs(char **argv, SDLVisualTest_HarnessState *state): harness_argparser.c'],['../harness__argparser_8c.html#a629609acc04ef21a21fdfbbf6c1589c8',1,'SDLVisualTest_ParseHarnessArgs(char **argv, SDLVisualTest_HarnessState *state): harness_argparser.c']]],
+ ['sdlvisualtest_5fparsesutconfig',['SDLVisualTest_ParseSUTConfig',['../_s_d_l__visualtest__sut__configparser_8h.html#a8e178cd8a1f279f5d2cf908545e97544',1,'SDLVisualTest_ParseSUTConfig(char *file, SDLVisualTest_SUTConfig *config): sut_configparser.c'],['../sut__configparser_8c.html#a8e178cd8a1f279f5d2cf908545e97544',1,'SDLVisualTest_ParseSUTConfig(char *file, SDLVisualTest_SUTConfig *config): sut_configparser.c']]],
+ ['sdlvisualtest_5frandomvariator',['SDLVisualTest_RandomVariator',['../struct_s_d_l_visual_test___random_variator.html',1,'SDLVisualTest_RandomVariator'],['../_s_d_l__visualtest__random__variator_8h.html#ab0df6ee6ec21b5070bfd8e90a7d79974',1,'SDLVisualTest_RandomVariator(): SDL_visualtest_random_variator.h']]],
+ ['sdlvisualtest_5frwhelperbuffer',['SDLVisualTest_RWHelperBuffer',['../struct_s_d_l_visual_test___r_w_helper_buffer.html',1,'']]],
+ ['sdlvisualtest_5frwhelpercountnonemptylines',['SDLVisualTest_RWHelperCountNonEmptyLines',['../rwhelper_8c.html#ac7f94417fa973af01a27452acd0043e8',1,'rwhelper.c']]],
+ ['sdlvisualtest_5frwhelperreadchar',['SDLVisualTest_RWHelperReadChar',['../rwhelper_8c.html#a92794c04d5568bde0da9f3020d88f44c',1,'rwhelper.c']]],
+ ['sdlvisualtest_5frwhelperreadline',['SDLVisualTest_RWHelperReadLine',['../rwhelper_8c.html#af97cfdf8d58f716efa8fd9204666df12',1,'rwhelper.c']]],
+ ['sdlvisualtest_5frwhelperresetbuffer',['SDLVisualTest_RWHelperResetBuffer',['../rwhelper_8c.html#aa7878508e6d851b11dc1d1186324064a',1,'rwhelper.c']]],
+ ['sdlvisualtest_5fscreenshotdesktop',['SDLVisualTest_ScreenshotDesktop',['../_s_d_l__visualtest__screenshot_8h.html#a812c545e97db11a756145d43b3a8e5ee',1,'SDL_visualtest_screenshot.h']]],
+ ['sdlvisualtest_5fscreenshotprocess',['SDLVisualTest_ScreenshotProcess',['../_s_d_l__visualtest__screenshot_8h.html#aefe6b7dbca1fbfb7aef081545c3ca66d',1,'SDL_visualtest_screenshot.h']]],
+ ['sdlvisualtest_5fsutconfig',['SDLVisualTest_SUTConfig',['../struct_s_d_l_visual_test___s_u_t_config.html',1,'SDLVisualTest_SUTConfig'],['../_s_d_l__visualtest__sut__configparser_8h.html#a1b493a40d601932b62ee643390aec169',1,'SDLVisualTest_SUTConfig(): SDL_visualtest_sut_configparser.h']]],
+ ['sdlvisualtest_5fsutintrange',['SDLVisualTest_SUTIntRange',['../struct_s_d_l_visual_test___s_u_t_int_range.html',1,'SDLVisualTest_SUTIntRange'],['../_s_d_l__visualtest__sut__configparser_8h.html#a8cbe93330b2ce59cdf6da59e2eca6045',1,'SDLVisualTest_SUTIntRange(): SDL_visualtest_sut_configparser.h']]],
+ ['sdlvisualtest_5fsutoption',['SDLVisualTest_SUTOption',['../struct_s_d_l_visual_test___s_u_t_option.html',1,'SDLVisualTest_SUTOption'],['../_s_d_l__visualtest__sut__configparser_8h.html#a9f35b5fe1ce4ba831a9b9e1f2bc8b7f6',1,'SDLVisualTest_SUTOption(): SDL_visualtest_sut_configparser.h']]],
+ ['sdlvisualtest_5fsutoptiontype',['SDLVisualTest_SUTOptionType',['../_s_d_l__visualtest__sut__configparser_8h.html#af9893831d9f79360f57e84a67a90293c',1,'SDL_visualtest_sut_configparser.h']]],
+ ['sdlvisualtest_5fsutoptionvalue',['SDLVisualTest_SUTOptionValue',['../union_s_d_l_visual_test___s_u_t_option_value.html',1,'SDLVisualTest_SUTOptionValue'],['../_s_d_l__visualtest__variator__common_8h.html#aa4e5fb752f4cd087101ea3e1f6124dfb',1,'SDLVisualTest_SUTOptionValue(): SDL_visualtest_variator_common.h']]],
+ ['sdlvisualtest_5ftokenize',['SDLVisualTest_Tokenize',['../_s_d_l__visualtest__parsehelper_8h.html#a508e690ed938e09fc3b724d2faf06899',1,'SDLVisualTest_Tokenize(char *str, int max_token_len): parsehelper.c'],['../parsehelper_8c.html#a508e690ed938e09fc3b724d2faf06899',1,'SDLVisualTest_Tokenize(char *str, int max_token_len): parsehelper.c']]],
+ ['sdlvisualtest_5fvariation',['SDLVisualTest_Variation',['../struct_s_d_l_visual_test___variation.html',1,'SDLVisualTest_Variation'],['../_s_d_l__visualtest__variator__common_8h.html#a6b447c1467862ecd623cc8f37489faeb',1,'SDLVisualTest_Variation(): SDL_visualtest_variator_common.h']]],
+ ['sdlvisualtest_5fvariator',['SDLVisualTest_Variator',['../struct_s_d_l_visual_test___variator.html',1,'SDLVisualTest_Variator'],['../_s_d_l__visualtest__variators_8h.html#a520a2479efbe9c4a9d617735f7314e0a',1,'SDLVisualTest_Variator(): SDL_visualtest_variators.h']]],
+ ['sdlvisualtest_5fvariatortype',['SDLVisualTest_VariatorType',['../_s_d_l__visualtest__variator__common_8h.html#a04bfc880abe6940d69a63c06a33acdbd',1,'SDLVisualTest_VariatorType(): SDL_visualtest_variator_common.h'],['../_s_d_l__visualtest__variator__common_8h.html#a4a7752dc89880ce3f62a478b3d0d8d64',1,'SDLVisualTest_VariatorType(): SDL_visualtest_variator_common.h']]],
+ ['sdlvisualtest_5fverifyscreenshots',['SDLVisualTest_VerifyScreenshots',['../_s_d_l__visualtest__screenshot_8h.html#ac7b5335651144961676abc2116c38299',1,'SDLVisualTest_VerifyScreenshots(char *args, char *test_dir, char *verify_dir): screenshot.c'],['../screenshot_8c.html#ac7b5335651144961676abc2116c38299',1,'SDLVisualTest_VerifyScreenshots(char *args, char *test_dir, char *verify_dir): screenshot.c']]],
+ ['size',['size',['../struct_s_d_l_visual_test___action_queue.html#a439227feff9d7f55384e8780cfc2eb82',1,'SDLVisualTest_ActionQueue']]],
+ ['string',['string',['../union_s_d_l_visual_test___s_u_t_option_value.html#a2bf4b969ff9633c937e4d15118d1edc6',1,'SDLVisualTest_SUTOptionValue']]],
+ ['sut_5fconfig',['sut_config',['../struct_s_d_l_visual_test___harness_state.html#a42657080015a96da836e1640bbdf870e',1,'SDLVisualTest_HarnessState']]],
+ ['sut_5fconfigparser_2ec',['sut_configparser.c',['../sut__configparser_8c.html',1,'']]],
+ ['sutapp',['sutapp',['../struct_s_d_l_visual_test___harness_state.html#af277bbb5c712eb89e92337dd583a8b74',1,'SDLVisualTest_HarnessState']]],
+ ['sutargs',['sutargs',['../struct_s_d_l_visual_test___harness_state.html#a00fab9c7cf802b96b6b29e098292d24d',1,'SDLVisualTest_HarnessState']]]
+];
diff --git a/visualtest/docs/html/search/all_74.html b/visualtest/docs/html/search/all_74.html
new file mode 100755
index 000000000..d7dabea0a
--- /dev/null
+++ b/visualtest/docs/html/search/all_74.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_74.js b/visualtest/docs/html/search/all_74.js
new file mode 100755
index 000000000..a955b1c18
--- /dev/null
+++ b/visualtest/docs/html/search/all_74.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['test_5ferror',['TEST_ERROR',['../testharness_8c.html#a8251bcdfc5c83845e0834adf211de033',1,'testharness.c']]],
+ ['test_5ffailed',['TEST_FAILED',['../testharness_8c.html#a8b8b91205df891e2c7837bd03795306f',1,'testharness.c']]],
+ ['test_5fpassed',['TEST_PASSED',['../testharness_8c.html#a562e15dd66cf158c98dbfec9f6afa1ae',1,'testharness.c']]],
+ ['testharness_2ec',['testharness.c',['../testharness_8c.html',1,'']]],
+ ['time',['time',['../struct_s_d_l_visual_test___action.html#a42715f65f02da52edc5b22021d8ae670',1,'SDLVisualTest_Action']]],
+ ['timeout',['timeout',['../struct_s_d_l_visual_test___harness_state.html#a493b57f443cc38b3d3df9c1e584d9d82',1,'SDLVisualTest_HarnessState']]],
+ ['type',['type',['../struct_s_d_l_visual_test___action.html#a3ab091b672fc470015f09e6c4c50dcf1',1,'SDLVisualTest_Action::type()'],['../struct_s_d_l_visual_test___s_u_t_option.html#a857b9e5ccfca26034b47a5f3236d822c',1,'SDLVisualTest_SUTOption::type()'],['../struct_s_d_l_visual_test___variator.html#a24d4399dc1877c1843e120e7b027ae64',1,'SDLVisualTest_Variator::type()']]]
+];
diff --git a/visualtest/docs/html/search/all_76.html b/visualtest/docs/html/search/all_76.html
new file mode 100755
index 000000000..33cae7d11
--- /dev/null
+++ b/visualtest/docs/html/search/all_76.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_76.js b/visualtest/docs/html/search/all_76.js
new file mode 100755
index 000000000..39d4e4503
--- /dev/null
+++ b/visualtest/docs/html/search/all_76.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['visual_20and_20interactive_20test_20automation_20for_20sdl_202_2e0',['Visual and Interactive Test Automation for SDL 2.0',['../index.html',1,'']]],
+ ['variation',['variation',['../struct_s_d_l_visual_test___exhaustive_variator.html#a11c2995cf19b41c4a1b1f8d9b4081ff7',1,'SDLVisualTest_ExhaustiveVariator::variation()'],['../struct_s_d_l_visual_test___random_variator.html#a11c2995cf19b41c4a1b1f8d9b4081ff7',1,'SDLVisualTest_RandomVariator::variation()']]],
+ ['variator_5fcommon_2ec',['variator_common.c',['../variator__common_8c.html',1,'']]],
+ ['variator_5fexhaustive_2ec',['variator_exhaustive.c',['../variator__exhaustive_8c.html',1,'']]],
+ ['variator_5frandom_2ec',['variator_random.c',['../variator__random_8c.html',1,'']]],
+ ['variator_5ftype',['variator_type',['../struct_s_d_l_visual_test___harness_state.html#aaaa989ae89caee6d39c722cfe6907466',1,'SDLVisualTest_HarnessState']]],
+ ['variators_2ec',['variators.c',['../variators_8c.html',1,'']]],
+ ['vars',['vars',['../struct_s_d_l_visual_test___variation.html#a1eab2e90f0195b4f4632eb19523aeadf',1,'SDLVisualTest_Variation']]],
+ ['verify_5fdir',['verify_dir',['../struct_s_d_l_visual_test___harness_state.html#adc871112f24f61e2fff74a7a7fb9794f',1,'SDLVisualTest_HarnessState']]]
+];
diff --git a/visualtest/docs/html/search/all_77.html b/visualtest/docs/html/search/all_77.html
new file mode 100755
index 000000000..d7ce72090
--- /dev/null
+++ b/visualtest/docs/html/search/all_77.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/all_77.js b/visualtest/docs/html/search/all_77.js
new file mode 100755
index 000000000..06134db92
--- /dev/null
+++ b/visualtest/docs/html/search/all_77.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['windows_5fprocess_2ec',['windows_process.c',['../windows__process_8c.html',1,'']]],
+ ['windows_5fscreenshot_2ec',['windows_screenshot.c',['../windows__screenshot_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/classes_73.html b/visualtest/docs/html/search/classes_73.html
new file mode 100755
index 000000000..0ddf5ea54
--- /dev/null
+++ b/visualtest/docs/html/search/classes_73.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/classes_73.js b/visualtest/docs/html/search/classes_73.js
new file mode 100755
index 000000000..e3d0f597d
--- /dev/null
+++ b/visualtest/docs/html/search/classes_73.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['sdl_5fprocessexitstatus',['SDL_ProcessExitStatus',['../struct_s_d_l___process_exit_status.html',1,'']]],
+ ['sdl_5fprocessinfo',['SDL_ProcessInfo',['../struct_s_d_l___process_info.html',1,'']]],
+ ['sdlvisualtest_5faction',['SDLVisualTest_Action',['../struct_s_d_l_visual_test___action.html',1,'']]],
+ ['sdlvisualtest_5factionnode',['SDLVisualTest_ActionNode',['../struct_s_d_l_visual_test___action_node.html',1,'']]],
+ ['sdlvisualtest_5factionqueue',['SDLVisualTest_ActionQueue',['../struct_s_d_l_visual_test___action_queue.html',1,'']]],
+ ['sdlvisualtest_5fexhaustivevariator',['SDLVisualTest_ExhaustiveVariator',['../struct_s_d_l_visual_test___exhaustive_variator.html',1,'']]],
+ ['sdlvisualtest_5fharnessstate',['SDLVisualTest_HarnessState',['../struct_s_d_l_visual_test___harness_state.html',1,'']]],
+ ['sdlvisualtest_5frandomvariator',['SDLVisualTest_RandomVariator',['../struct_s_d_l_visual_test___random_variator.html',1,'']]],
+ ['sdlvisualtest_5frwhelperbuffer',['SDLVisualTest_RWHelperBuffer',['../struct_s_d_l_visual_test___r_w_helper_buffer.html',1,'']]],
+ ['sdlvisualtest_5fsutconfig',['SDLVisualTest_SUTConfig',['../struct_s_d_l_visual_test___s_u_t_config.html',1,'']]],
+ ['sdlvisualtest_5fsutintrange',['SDLVisualTest_SUTIntRange',['../struct_s_d_l_visual_test___s_u_t_int_range.html',1,'']]],
+ ['sdlvisualtest_5fsutoption',['SDLVisualTest_SUTOption',['../struct_s_d_l_visual_test___s_u_t_option.html',1,'']]],
+ ['sdlvisualtest_5fsutoptionvalue',['SDLVisualTest_SUTOptionValue',['../union_s_d_l_visual_test___s_u_t_option_value.html',1,'']]],
+ ['sdlvisualtest_5fvariation',['SDLVisualTest_Variation',['../struct_s_d_l_visual_test___variation.html',1,'']]],
+ ['sdlvisualtest_5fvariator',['SDLVisualTest_Variator',['../struct_s_d_l_visual_test___variator.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/close.png b/visualtest/docs/html/search/close.png
new file mode 100755
index 000000000..9342d3dfe
Binary files /dev/null and b/visualtest/docs/html/search/close.png differ
diff --git a/visualtest/docs/html/search/defines_61.html b/visualtest/docs/html/search/defines_61.html
new file mode 100755
index 000000000..32e073212
--- /dev/null
+++ b/visualtest/docs/html/search/defines_61.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/defines_61.js b/visualtest/docs/html/search/defines_61.js
new file mode 100755
index 000000000..6c0916b16
--- /dev/null
+++ b/visualtest/docs/html/search/defines_61.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['action_5floop_5ffps',['ACTION_LOOP_FPS',['../testharness_8c.html#a70102426e83ed3944f9c060bd82fb54e',1,'testharness.c']]],
+ ['action_5ftimer_5fevent',['ACTION_TIMER_EVENT',['../testharness_8c.html#a0d1d5d1394089a10f0147ed2b89c1165',1,'testharness.c']]]
+];
diff --git a/visualtest/docs/html/search/defines_64.html b/visualtest/docs/html/search/defines_64.html
new file mode 100755
index 000000000..a3dd91d47
--- /dev/null
+++ b/visualtest/docs/html/search/defines_64.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/defines_64.js b/visualtest/docs/html/search/defines_64.js
new file mode 100755
index 000000000..1d08f16aa
--- /dev/null
+++ b/visualtest/docs/html/search/defines_64.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['default_5fsut_5ftimeout',['DEFAULT_SUT_TIMEOUT',['../harness__argparser_8c.html#a6669f8e5a07e7a0e4622dd23362831e7',1,'harness_argparser.c']]]
+];
diff --git a/visualtest/docs/html/search/defines_6b.html b/visualtest/docs/html/search/defines_6b.html
new file mode 100755
index 000000000..82965dcbc
--- /dev/null
+++ b/visualtest/docs/html/search/defines_6b.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/defines_6b.js b/visualtest/docs/html/search/defines_6b.js
new file mode 100755
index 000000000..831fa2c4e
--- /dev/null
+++ b/visualtest/docs/html/search/defines_6b.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['kill_5ftimer_5fevent',['KILL_TIMER_EVENT',['../testharness_8c.html#acdc6cb4935ca89fbe3fda31a8f533b9a',1,'testharness.c']]]
+];
diff --git a/visualtest/docs/html/search/defines_6d.html b/visualtest/docs/html/search/defines_6d.html
new file mode 100755
index 000000000..281ca78c5
--- /dev/null
+++ b/visualtest/docs/html/search/defines_6d.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/defines_6d.js b/visualtest/docs/html/search/defines_6d.js
new file mode 100755
index 000000000..dc4bd5e3e
--- /dev/null
+++ b/visualtest/docs/html/search/defines_6d.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['max_5faction_5fline_5flength',['MAX_ACTION_LINE_LENGTH',['../_s_d_l__visualtest__action__configparser_8h.html#a19244c2e1556665be344807ace1556ed',1,'SDL_visualtest_action_configparser.h']]],
+ ['max_5fconfig_5fline_5flen',['MAX_CONFIG_LINE_LEN',['../harness__argparser_8c.html#a7186273cd88640b740b6333cd98ae243',1,'harness_argparser.c']]],
+ ['max_5fpath_5flen',['MAX_PATH_LEN',['../_s_d_l__visualtest__harness__argparser_8h.html#abdd33f362ae3bbdacb5de76473aa8a2f',1,'SDL_visualtest_harness_argparser.h']]],
+ ['max_5fsut_5fargs_5flen',['MAX_SUT_ARGS_LEN',['../_s_d_l__visualtest__harness__argparser_8h.html#a8485cbda108eca56406d67aaa685fcc5',1,'SDL_visualtest_harness_argparser.h']]],
+ ['max_5fsutoption_5fcategory_5flen',['MAX_SUTOPTION_CATEGORY_LEN',['../_s_d_l__visualtest__sut__configparser_8h.html#a21a678ced8cdf55b4cc70ad398bf33b6',1,'SDL_visualtest_sut_configparser.h']]],
+ ['max_5fsutoption_5fenumval_5flen',['MAX_SUTOPTION_ENUMVAL_LEN',['../_s_d_l__visualtest__sut__configparser_8h.html#a6c700fc8ff02cfa0c795b9593f86b9a0',1,'SDL_visualtest_sut_configparser.h']]],
+ ['max_5fsutoption_5fline_5flength',['MAX_SUTOPTION_LINE_LENGTH',['../_s_d_l__visualtest__sut__configparser_8h.html#a8f1a5749af5a592b30a194c72d848f75',1,'SDL_visualtest_sut_configparser.h']]],
+ ['max_5fsutoption_5fname_5flen',['MAX_SUTOPTION_NAME_LEN',['../_s_d_l__visualtest__sut__configparser_8h.html#a0a8b0c1f8eee787abf09bf3a840eccc7',1,'SDL_visualtest_sut_configparser.h']]]
+];
diff --git a/visualtest/docs/html/search/defines_73.html b/visualtest/docs/html/search/defines_73.html
new file mode 100755
index 000000000..d101548a7
--- /dev/null
+++ b/visualtest/docs/html/search/defines_73.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/defines_73.js b/visualtest/docs/html/search/defines_73.js
new file mode 100755
index 000000000..d23464e7a
--- /dev/null
+++ b/visualtest/docs/html/search/defines_73.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['sdl_5fsut_5finteger_5foption_5ftest_5fsteps',['SDL_SUT_INTEGER_OPTION_TEST_STEPS',['../_s_d_l__visualtest__variator__common_8h.html#afcdce86a10fbcdc9f3e47c47b70e3ea3',1,'SDL_visualtest_variator_common.h']]]
+];
diff --git a/visualtest/docs/html/search/defines_74.html b/visualtest/docs/html/search/defines_74.html
new file mode 100755
index 000000000..4b3c29875
--- /dev/null
+++ b/visualtest/docs/html/search/defines_74.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/defines_74.js b/visualtest/docs/html/search/defines_74.js
new file mode 100755
index 000000000..6845258a5
--- /dev/null
+++ b/visualtest/docs/html/search/defines_74.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['test_5ferror',['TEST_ERROR',['../testharness_8c.html#a8251bcdfc5c83845e0834adf211de033',1,'testharness.c']]],
+ ['test_5ffailed',['TEST_FAILED',['../testharness_8c.html#a8b8b91205df891e2c7837bd03795306f',1,'testharness.c']]],
+ ['test_5fpassed',['TEST_PASSED',['../testharness_8c.html#a562e15dd66cf158c98dbfec9f6afa1ae',1,'testharness.c']]]
+];
diff --git a/visualtest/docs/html/search/enums_73.html b/visualtest/docs/html/search/enums_73.html
new file mode 100755
index 000000000..7d2f3b303
--- /dev/null
+++ b/visualtest/docs/html/search/enums_73.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/enums_73.js b/visualtest/docs/html/search/enums_73.js
new file mode 100755
index 000000000..de876b49d
--- /dev/null
+++ b/visualtest/docs/html/search/enums_73.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['sdlvisualtest_5factiontype',['SDLVisualTest_ActionType',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdlvisualtest_5fsutoptiontype',['SDLVisualTest_SUTOptionType',['../_s_d_l__visualtest__sut__configparser_8h.html#af9893831d9f79360f57e84a67a90293c',1,'SDL_visualtest_sut_configparser.h']]],
+ ['sdlvisualtest_5fvariatortype',['SDLVisualTest_VariatorType',['../_s_d_l__visualtest__variator__common_8h.html#a04bfc880abe6940d69a63c06a33acdbd',1,'SDL_visualtest_variator_common.h']]]
+];
diff --git a/visualtest/docs/html/search/enumvalues_73.html b/visualtest/docs/html/search/enumvalues_73.html
new file mode 100755
index 000000000..7379c7f5c
--- /dev/null
+++ b/visualtest/docs/html/search/enumvalues_73.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/enumvalues_73.js b/visualtest/docs/html/search/enumvalues_73.js
new file mode 100755
index 000000000..4a3422677
--- /dev/null
+++ b/visualtest/docs/html/search/enumvalues_73.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['sdl_5faction_5fkill',['SDL_ACTION_KILL',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6a87880c4f665344d4c3e12f9aa3af7410',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdl_5faction_5flaunch',['SDL_ACTION_LAUNCH',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6ac5344bca6af9c07c4ee69ee4c2b18df2',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdl_5faction_5fquit',['SDL_ACTION_QUIT',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6ad3d17a830b7e1e46e37d916130d8802a',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdl_5faction_5fscreenshot',['SDL_ACTION_SCREENSHOT',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6af9b5d42cb90bf843f298be4593992fdb',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdl_5faction_5fverify',['SDL_ACTION_VERIFY',['../_s_d_l__visualtest__action__configparser_8h.html#a383e41b8547eab149a0a4af867b3ebc6a0853f8be8363015b822658b9f3b013f4',1,'SDL_visualtest_action_configparser.h']]]
+];
diff --git a/visualtest/docs/html/search/files_61.html b/visualtest/docs/html/search/files_61.html
new file mode 100755
index 000000000..c7378fc6d
--- /dev/null
+++ b/visualtest/docs/html/search/files_61.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/files_61.js b/visualtest/docs/html/search/files_61.js
new file mode 100755
index 000000000..6cbf8398f
--- /dev/null
+++ b/visualtest/docs/html/search/files_61.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['action_5fconfigparser_2ec',['action_configparser.c',['../action__configparser_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/files_68.html b/visualtest/docs/html/search/files_68.html
new file mode 100755
index 000000000..0ecafca98
--- /dev/null
+++ b/visualtest/docs/html/search/files_68.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/files_68.js b/visualtest/docs/html/search/files_68.js
new file mode 100755
index 000000000..c2615b10c
--- /dev/null
+++ b/visualtest/docs/html/search/files_68.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['harness_5fargparser_2ec',['harness_argparser.c',['../harness__argparser_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/files_6c.html b/visualtest/docs/html/search/files_6c.html
new file mode 100755
index 000000000..3eda986dd
--- /dev/null
+++ b/visualtest/docs/html/search/files_6c.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/files_6c.js b/visualtest/docs/html/search/files_6c.js
new file mode 100755
index 000000000..f6a1353d1
--- /dev/null
+++ b/visualtest/docs/html/search/files_6c.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['linux_5fprocess_2ec',['linux_process.c',['../linux__process_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/files_6d.html b/visualtest/docs/html/search/files_6d.html
new file mode 100755
index 000000000..8148b75cc
--- /dev/null
+++ b/visualtest/docs/html/search/files_6d.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/files_6d.js b/visualtest/docs/html/search/files_6d.js
new file mode 100755
index 000000000..431dcf85a
--- /dev/null
+++ b/visualtest/docs/html/search/files_6d.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['mischelper_2ec',['mischelper.c',['../mischelper_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/files_70.html b/visualtest/docs/html/search/files_70.html
new file mode 100755
index 000000000..a053becd4
--- /dev/null
+++ b/visualtest/docs/html/search/files_70.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/files_70.js b/visualtest/docs/html/search/files_70.js
new file mode 100755
index 000000000..1e471d831
--- /dev/null
+++ b/visualtest/docs/html/search/files_70.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['parsehelper_2ec',['parsehelper.c',['../parsehelper_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/files_72.html b/visualtest/docs/html/search/files_72.html
new file mode 100755
index 000000000..a952842ba
--- /dev/null
+++ b/visualtest/docs/html/search/files_72.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/files_72.js b/visualtest/docs/html/search/files_72.js
new file mode 100755
index 000000000..29b7e5610
--- /dev/null
+++ b/visualtest/docs/html/search/files_72.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['rwhelper_2ec',['rwhelper.c',['../rwhelper_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/files_73.html b/visualtest/docs/html/search/files_73.html
new file mode 100755
index 000000000..6d8f48898
--- /dev/null
+++ b/visualtest/docs/html/search/files_73.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/files_73.js b/visualtest/docs/html/search/files_73.js
new file mode 100755
index 000000000..2d4c61f57
--- /dev/null
+++ b/visualtest/docs/html/search/files_73.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+ ['screenshot_2ec',['screenshot.c',['../screenshot_8c.html',1,'']]],
+ ['sdl_5fvisualtest_5faction_5fconfigparser_2eh',['SDL_visualtest_action_configparser.h',['../_s_d_l__visualtest__action__configparser_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fexhaustive_5fvariator_2eh',['SDL_visualtest_exhaustive_variator.h',['../_s_d_l__visualtest__exhaustive__variator_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fharness_5fargparser_2eh',['SDL_visualtest_harness_argparser.h',['../_s_d_l__visualtest__harness__argparser_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fparsehelper_2eh',['SDL_visualtest_parsehelper.h',['../_s_d_l__visualtest__parsehelper_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fprocess_2eh',['SDL_visualtest_process.h',['../_s_d_l__visualtest__process_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5frandom_5fvariator_2eh',['SDL_visualtest_random_variator.h',['../_s_d_l__visualtest__random__variator_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fscreenshot_2eh',['SDL_visualtest_screenshot.h',['../_s_d_l__visualtest__screenshot_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fsut_5fconfigparser_2eh',['SDL_visualtest_sut_configparser.h',['../_s_d_l__visualtest__sut__configparser_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fvariator_5fcommon_2eh',['SDL_visualtest_variator_common.h',['../_s_d_l__visualtest__variator__common_8h.html',1,'']]],
+ ['sdl_5fvisualtest_5fvariators_2eh',['SDL_visualtest_variators.h',['../_s_d_l__visualtest__variators_8h.html',1,'']]],
+ ['sut_5fconfigparser_2ec',['sut_configparser.c',['../sut__configparser_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/files_74.html b/visualtest/docs/html/search/files_74.html
new file mode 100755
index 000000000..b67c32ee7
--- /dev/null
+++ b/visualtest/docs/html/search/files_74.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/files_74.js b/visualtest/docs/html/search/files_74.js
new file mode 100755
index 000000000..a339ccbe9
--- /dev/null
+++ b/visualtest/docs/html/search/files_74.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['testharness_2ec',['testharness.c',['../testharness_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/files_76.html b/visualtest/docs/html/search/files_76.html
new file mode 100755
index 000000000..2ea8e3c08
--- /dev/null
+++ b/visualtest/docs/html/search/files_76.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/files_76.js b/visualtest/docs/html/search/files_76.js
new file mode 100755
index 000000000..d32b6a6fd
--- /dev/null
+++ b/visualtest/docs/html/search/files_76.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['variator_5fcommon_2ec',['variator_common.c',['../variator__common_8c.html',1,'']]],
+ ['variator_5fexhaustive_2ec',['variator_exhaustive.c',['../variator__exhaustive_8c.html',1,'']]],
+ ['variator_5frandom_2ec',['variator_random.c',['../variator__random_8c.html',1,'']]],
+ ['variators_2ec',['variators.c',['../variators_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/files_77.html b/visualtest/docs/html/search/files_77.html
new file mode 100755
index 000000000..cfba7eaf7
--- /dev/null
+++ b/visualtest/docs/html/search/files_77.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/files_77.js b/visualtest/docs/html/search/files_77.js
new file mode 100755
index 000000000..06134db92
--- /dev/null
+++ b/visualtest/docs/html/search/files_77.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['windows_5fprocess_2ec',['windows_process.c',['../windows__process_8c.html',1,'']]],
+ ['windows_5fscreenshot_2ec',['windows_screenshot.c',['../windows__screenshot_8c.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/functions_6d.html b/visualtest/docs/html/search/functions_6d.html
new file mode 100755
index 000000000..cc3d484f8
--- /dev/null
+++ b/visualtest/docs/html/search/functions_6d.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/functions_6d.js b/visualtest/docs/html/search/functions_6d.js
new file mode 100755
index 000000000..f93b71f18
--- /dev/null
+++ b/visualtest/docs/html/search/functions_6d.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['main',['main',['../testharness_8c.html#a0ddf1224851353fc92bfbff6f499fa97',1,'testharness.c']]]
+];
diff --git a/visualtest/docs/html/search/functions_73.html b/visualtest/docs/html/search/functions_73.html
new file mode 100755
index 000000000..071b44fbf
--- /dev/null
+++ b/visualtest/docs/html/search/functions_73.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/functions_73.js b/visualtest/docs/html/search/functions_73.js
new file mode 100755
index 000000000..ee1ca9801
--- /dev/null
+++ b/visualtest/docs/html/search/functions_73.js
@@ -0,0 +1,42 @@
+var searchData=
+[
+ ['sdl_5fgetprocessexitstatus',['SDL_GetProcessExitStatus',['../_s_d_l__visualtest__process_8h.html#a54545d6b9f737a14030b4ce55ddd4a62',1,'SDL_visualtest_process.h']]],
+ ['sdl_5fisprocessrunning',['SDL_IsProcessRunning',['../_s_d_l__visualtest__process_8h.html#a3a131140a71bf68fa68a900f06872239',1,'SDL_visualtest_process.h']]],
+ ['sdl_5fkillprocess',['SDL_KillProcess',['../_s_d_l__visualtest__process_8h.html#ae66242e44a004831ab231693fd11c8d0',1,'SDL_visualtest_process.h']]],
+ ['sdl_5flaunchprocess',['SDL_LaunchProcess',['../_s_d_l__visualtest__process_8h.html#a12c16e5b870e2794d6bd5a1a3bb4582f',1,'SDL_visualtest_process.h']]],
+ ['sdl_5fquitprocess',['SDL_QuitProcess',['../_s_d_l__visualtest__process_8h.html#ad8a5b6725ad1f0e1bac623cf4b6fc28d',1,'SDL_visualtest_process.h']]],
+ ['sdlvisualtest_5fdequeueaction',['SDLVisualTest_DequeueAction',['../_s_d_l__visualtest__action__configparser_8h.html#a0e7998533e6e10590612a8d5dee7ec0b',1,'SDLVisualTest_DequeueAction(SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#a0e7998533e6e10590612a8d5dee7ec0b',1,'SDLVisualTest_DequeueAction(SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5femptyactionqueue',['SDLVisualTest_EmptyActionQueue',['../_s_d_l__visualtest__action__configparser_8h.html#a677da0d0e4793df342f91974b4559efa',1,'SDLVisualTest_EmptyActionQueue(SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#a677da0d0e4793df342f91974b4559efa',1,'SDLVisualTest_EmptyActionQueue(SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5fenqueueaction',['SDLVisualTest_EnqueueAction',['../_s_d_l__visualtest__action__configparser_8h.html#a647d1be8f0f27af2fb1e5d4da2100596',1,'SDLVisualTest_EnqueueAction(SDLVisualTest_ActionQueue *queue, SDLVisualTest_Action action): action_configparser.c'],['../action__configparser_8c.html#a647d1be8f0f27af2fb1e5d4da2100596',1,'SDLVisualTest_EnqueueAction(SDLVisualTest_ActionQueue *queue, SDLVisualTest_Action action): action_configparser.c']]],
+ ['sdlvisualtest_5ffreeexhaustivevariator',['SDLVisualTest_FreeExhaustiveVariator',['../_s_d_l__visualtest__exhaustive__variator_8h.html#a7168b055fb86bbbb700d87ae842f7152',1,'SDLVisualTest_FreeExhaustiveVariator(SDLVisualTest_ExhaustiveVariator *variator): variator_exhaustive.c'],['../variator__exhaustive_8c.html#a7168b055fb86bbbb700d87ae842f7152',1,'SDLVisualTest_FreeExhaustiveVariator(SDLVisualTest_ExhaustiveVariator *variator): variator_exhaustive.c']]],
+ ['sdlvisualtest_5ffreeharnessstate',['SDLVisualTest_FreeHarnessState',['../_s_d_l__visualtest__harness__argparser_8h.html#a833147d8da541982c615645a797627cc',1,'SDLVisualTest_FreeHarnessState(SDLVisualTest_HarnessState *state): harness_argparser.c'],['../harness__argparser_8c.html#a833147d8da541982c615645a797627cc',1,'SDLVisualTest_FreeHarnessState(SDLVisualTest_HarnessState *state): harness_argparser.c']]],
+ ['sdlvisualtest_5ffreerandomvariator',['SDLVisualTest_FreeRandomVariator',['../_s_d_l__visualtest__random__variator_8h.html#ac95d9e0716e4c918c6902b10f9591d4b',1,'SDLVisualTest_FreeRandomVariator(SDLVisualTest_RandomVariator *variator): variator_random.c'],['../variator__random_8c.html#ac95d9e0716e4c918c6902b10f9591d4b',1,'SDLVisualTest_FreeRandomVariator(SDLVisualTest_RandomVariator *variator): variator_random.c']]],
+ ['sdlvisualtest_5ffreesutconfig',['SDLVisualTest_FreeSUTConfig',['../_s_d_l__visualtest__sut__configparser_8h.html#a1bddf9732c0d3ed1c24455d22193de9a',1,'SDLVisualTest_FreeSUTConfig(SDLVisualTest_SUTConfig *config): sut_configparser.c'],['../sut__configparser_8c.html#a1bddf9732c0d3ed1c24455d22193de9a',1,'SDLVisualTest_FreeSUTConfig(SDLVisualTest_SUTConfig *config): sut_configparser.c']]],
+ ['sdlvisualtest_5ffreevariator',['SDLVisualTest_FreeVariator',['../_s_d_l__visualtest__variators_8h.html#a98727ef649135c3312056d7603cb70b5',1,'SDLVisualTest_FreeVariator(SDLVisualTest_Variator *variator): variators.c'],['../variators_8c.html#a98727ef649135c3312056d7603cb70b5',1,'SDLVisualTest_FreeVariator(SDLVisualTest_Variator *variator): variators.c']]],
+ ['sdlvisualtest_5fgetnextexhaustivevariation',['SDLVisualTest_GetNextExhaustiveVariation',['../_s_d_l__visualtest__exhaustive__variator_8h.html#aa9e13a92945ef48308215b3fa068ed29',1,'SDLVisualTest_GetNextExhaustiveVariation(SDLVisualTest_ExhaustiveVariator *variator): variator_exhaustive.c'],['../variator__exhaustive_8c.html#aa9e13a92945ef48308215b3fa068ed29',1,'SDLVisualTest_GetNextExhaustiveVariation(SDLVisualTest_ExhaustiveVariator *variator): variator_exhaustive.c']]],
+ ['sdlvisualtest_5fgetnextrandomvariation',['SDLVisualTest_GetNextRandomVariation',['../_s_d_l__visualtest__random__variator_8h.html#a479aceb74b5355c1d22856fc7efce890',1,'SDLVisualTest_GetNextRandomVariation(SDLVisualTest_RandomVariator *variator): variator_random.c'],['../variator__random_8c.html#a479aceb74b5355c1d22856fc7efce890',1,'SDLVisualTest_GetNextRandomVariation(SDLVisualTest_RandomVariator *variator): variator_random.c']]],
+ ['sdlvisualtest_5fgetnextvariation',['SDLVisualTest_GetNextVariation',['../_s_d_l__visualtest__variators_8h.html#aebdd4c3c545b0063d16929fd56f1a79f',1,'SDLVisualTest_GetNextVariation(SDLVisualTest_Variator *variator): variators.c'],['../variators_8c.html#aebdd4c3c545b0063d16929fd56f1a79f',1,'SDLVisualTest_GetNextVariation(SDLVisualTest_Variator *variator): variators.c']]],
+ ['sdlvisualtest_5fgetqueuefront',['SDLVisualTest_GetQueueFront',['../_s_d_l__visualtest__action__configparser_8h.html#afb508801942e7c74084480bcdb6f8613',1,'SDLVisualTest_GetQueueFront(SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#afb508801942e7c74084480bcdb6f8613',1,'SDLVisualTest_GetQueueFront(SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5fhashstring',['SDLVisualTest_HashString',['../mischelper_8c.html#a0dae46cdb4e58bdda78676260eaaf980',1,'mischelper.c']]],
+ ['sdlvisualtest_5finitactionqueue',['SDLVisualTest_InitActionQueue',['../_s_d_l__visualtest__action__configparser_8h.html#ae68c1c80f728e125869882139bec2c9e',1,'SDLVisualTest_InitActionQueue(SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#ae68c1c80f728e125869882139bec2c9e',1,'SDLVisualTest_InitActionQueue(SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5finitexhaustivevariator',['SDLVisualTest_InitExhaustiveVariator',['../_s_d_l__visualtest__exhaustive__variator_8h.html#a9e213e530ddf5a18014786d10e9fdaee',1,'SDLVisualTest_InitExhaustiveVariator(SDLVisualTest_ExhaustiveVariator *variator, SDLVisualTest_SUTConfig *config): variator_exhaustive.c'],['../variator__exhaustive_8c.html#a9e213e530ddf5a18014786d10e9fdaee',1,'SDLVisualTest_InitExhaustiveVariator(SDLVisualTest_ExhaustiveVariator *variator, SDLVisualTest_SUTConfig *config): variator_exhaustive.c']]],
+ ['sdlvisualtest_5finitrandomvariator',['SDLVisualTest_InitRandomVariator',['../_s_d_l__visualtest__random__variator_8h.html#a807486069b7180c3b3bf8af4616d055f',1,'SDLVisualTest_InitRandomVariator(SDLVisualTest_RandomVariator *variator, SDLVisualTest_SUTConfig *config, Uint64 seed): variator_random.c'],['../variator__random_8c.html#a807486069b7180c3b3bf8af4616d055f',1,'SDLVisualTest_InitRandomVariator(SDLVisualTest_RandomVariator *variator, SDLVisualTest_SUTConfig *config, Uint64 seed): variator_random.c']]],
+ ['sdlvisualtest_5finitvariation',['SDLVisualTest_InitVariation',['../_s_d_l__visualtest__variator__common_8h.html#ac87934906c51364778dc910ebca47b6c',1,'SDLVisualTest_InitVariation(SDLVisualTest_Variation *variation, SDLVisualTest_SUTConfig *config): variator_common.c'],['../variator__common_8c.html#ac87934906c51364778dc910ebca47b6c',1,'SDLVisualTest_InitVariation(SDLVisualTest_Variation *variation, SDLVisualTest_SUTConfig *config): variator_common.c']]],
+ ['sdlvisualtest_5finitvariator',['SDLVisualTest_InitVariator',['../_s_d_l__visualtest__variators_8h.html#ac1d82ee387a19743e47a82c87d3fb7f4',1,'SDLVisualTest_InitVariator(SDLVisualTest_Variator *variator, SDLVisualTest_SUTConfig *config, SDLVisualTest_VariatorType type, Uint64 seed): variators.c'],['../variators_8c.html#ac1d82ee387a19743e47a82c87d3fb7f4',1,'SDLVisualTest_InitVariator(SDLVisualTest_Variator *variator, SDLVisualTest_SUTConfig *config, SDLVisualTest_VariatorType type, Uint64 seed): variators.c']]],
+ ['sdlvisualtest_5finsertintoactionqueue',['SDLVisualTest_InsertIntoActionQueue',['../_s_d_l__visualtest__action__configparser_8h.html#ace5374ef7509e95383929ff185aaf7e6',1,'SDLVisualTest_InsertIntoActionQueue(SDLVisualTest_ActionQueue *queue, SDLVisualTest_Action action): action_configparser.c'],['../action__configparser_8c.html#ace5374ef7509e95383929ff185aaf7e6',1,'SDLVisualTest_InsertIntoActionQueue(SDLVisualTest_ActionQueue *queue, SDLVisualTest_Action action): action_configparser.c']]],
+ ['sdlvisualtest_5fisactionqueueempty',['SDLVisualTest_IsActionQueueEmpty',['../_s_d_l__visualtest__action__configparser_8h.html#a8484ee36f78952192d4193c85fca2f17',1,'SDLVisualTest_IsActionQueueEmpty(SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#a8484ee36f78952192d4193c85fca2f17',1,'SDLVisualTest_IsActionQueueEmpty(SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5fmakestrfromvariation',['SDLVisualTest_MakeStrFromVariation',['../_s_d_l__visualtest__variator__common_8h.html#ad981c2efab849e76dc878ef8da9d6017',1,'SDLVisualTest_MakeStrFromVariation(SDLVisualTest_Variation *variation, SDLVisualTest_SUTConfig *config, char *buffer, int size): variator_common.c'],['../variator__common_8c.html#ad981c2efab849e76dc878ef8da9d6017',1,'SDLVisualTest_MakeStrFromVariation(SDLVisualTest_Variation *variation, SDLVisualTest_SUTConfig *config, char *buffer, int size): variator_common.c']]],
+ ['sdlvisualtest_5fnextvalue',['SDLVisualTest_NextValue',['../_s_d_l__visualtest__variator__common_8h.html#aafcecc06c8feb24b6f6a509bfa9db681',1,'SDLVisualTest_NextValue(SDLVisualTest_SUTOptionValue *var, SDLVisualTest_SUTOption *opt): variator_common.c'],['../variator__common_8c.html#aafcecc06c8feb24b6f6a509bfa9db681',1,'SDLVisualTest_NextValue(SDLVisualTest_SUTOptionValue *var, SDLVisualTest_SUTOption *opt): variator_common.c']]],
+ ['sdlvisualtest_5fparseactionconfig',['SDLVisualTest_ParseActionConfig',['../_s_d_l__visualtest__action__configparser_8h.html#a8ef9dce4d464d6994596deeace6ffa2d',1,'SDLVisualTest_ParseActionConfig(char *file, SDLVisualTest_ActionQueue *queue): action_configparser.c'],['../action__configparser_8c.html#a8ef9dce4d464d6994596deeace6ffa2d',1,'SDLVisualTest_ParseActionConfig(char *file, SDLVisualTest_ActionQueue *queue): action_configparser.c']]],
+ ['sdlvisualtest_5fparseargstoargv',['SDLVisualTest_ParseArgsToArgv',['../_s_d_l__visualtest__parsehelper_8h.html#a5f168fdd02f9d40ddbad97bd8c0b6361',1,'SDLVisualTest_ParseArgsToArgv(char *args): parsehelper.c'],['../parsehelper_8c.html#a5f168fdd02f9d40ddbad97bd8c0b6361',1,'SDLVisualTest_ParseArgsToArgv(char *args): parsehelper.c']]],
+ ['sdlvisualtest_5fparseharnessargs',['SDLVisualTest_ParseHarnessArgs',['../_s_d_l__visualtest__harness__argparser_8h.html#a629609acc04ef21a21fdfbbf6c1589c8',1,'SDLVisualTest_ParseHarnessArgs(char **argv, SDLVisualTest_HarnessState *state): harness_argparser.c'],['../harness__argparser_8c.html#a629609acc04ef21a21fdfbbf6c1589c8',1,'SDLVisualTest_ParseHarnessArgs(char **argv, SDLVisualTest_HarnessState *state): harness_argparser.c']]],
+ ['sdlvisualtest_5fparsesutconfig',['SDLVisualTest_ParseSUTConfig',['../_s_d_l__visualtest__sut__configparser_8h.html#a8e178cd8a1f279f5d2cf908545e97544',1,'SDLVisualTest_ParseSUTConfig(char *file, SDLVisualTest_SUTConfig *config): sut_configparser.c'],['../sut__configparser_8c.html#a8e178cd8a1f279f5d2cf908545e97544',1,'SDLVisualTest_ParseSUTConfig(char *file, SDLVisualTest_SUTConfig *config): sut_configparser.c']]],
+ ['sdlvisualtest_5frwhelpercountnonemptylines',['SDLVisualTest_RWHelperCountNonEmptyLines',['../rwhelper_8c.html#ac7f94417fa973af01a27452acd0043e8',1,'rwhelper.c']]],
+ ['sdlvisualtest_5frwhelperreadchar',['SDLVisualTest_RWHelperReadChar',['../rwhelper_8c.html#a92794c04d5568bde0da9f3020d88f44c',1,'rwhelper.c']]],
+ ['sdlvisualtest_5frwhelperreadline',['SDLVisualTest_RWHelperReadLine',['../rwhelper_8c.html#af97cfdf8d58f716efa8fd9204666df12',1,'rwhelper.c']]],
+ ['sdlvisualtest_5frwhelperresetbuffer',['SDLVisualTest_RWHelperResetBuffer',['../rwhelper_8c.html#aa7878508e6d851b11dc1d1186324064a',1,'rwhelper.c']]],
+ ['sdlvisualtest_5fscreenshotdesktop',['SDLVisualTest_ScreenshotDesktop',['../_s_d_l__visualtest__screenshot_8h.html#a812c545e97db11a756145d43b3a8e5ee',1,'SDL_visualtest_screenshot.h']]],
+ ['sdlvisualtest_5fscreenshotprocess',['SDLVisualTest_ScreenshotProcess',['../_s_d_l__visualtest__screenshot_8h.html#aefe6b7dbca1fbfb7aef081545c3ca66d',1,'SDL_visualtest_screenshot.h']]],
+ ['sdlvisualtest_5ftokenize',['SDLVisualTest_Tokenize',['../_s_d_l__visualtest__parsehelper_8h.html#a508e690ed938e09fc3b724d2faf06899',1,'SDLVisualTest_Tokenize(char *str, int max_token_len): parsehelper.c'],['../parsehelper_8c.html#a508e690ed938e09fc3b724d2faf06899',1,'SDLVisualTest_Tokenize(char *str, int max_token_len): parsehelper.c']]],
+ ['sdlvisualtest_5fverifyscreenshots',['SDLVisualTest_VerifyScreenshots',['../_s_d_l__visualtest__screenshot_8h.html#ac7b5335651144961676abc2116c38299',1,'SDLVisualTest_VerifyScreenshots(char *args, char *test_dir, char *verify_dir): screenshot.c'],['../screenshot_8c.html#ac7b5335651144961676abc2116c38299',1,'SDLVisualTest_VerifyScreenshots(char *args, char *test_dir, char *verify_dir): screenshot.c']]]
+];
diff --git a/visualtest/docs/html/search/mag_sel.png b/visualtest/docs/html/search/mag_sel.png
new file mode 100755
index 000000000..81f6040a2
Binary files /dev/null and b/visualtest/docs/html/search/mag_sel.png differ
diff --git a/visualtest/docs/html/search/nomatches.html b/visualtest/docs/html/search/nomatches.html
new file mode 100755
index 000000000..b1ded27e9
--- /dev/null
+++ b/visualtest/docs/html/search/nomatches.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/search/pages_76.html b/visualtest/docs/html/search/pages_76.html
new file mode 100755
index 000000000..c180e9b88
--- /dev/null
+++ b/visualtest/docs/html/search/pages_76.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/pages_76.js b/visualtest/docs/html/search/pages_76.js
new file mode 100755
index 000000000..9f2660f88
--- /dev/null
+++ b/visualtest/docs/html/search/pages_76.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['visual_20and_20interactive_20test_20automation_20for_20sdl_202_2e0',['Visual and Interactive Test Automation for SDL 2.0',['../index.html',1,'']]]
+];
diff --git a/visualtest/docs/html/search/search.css b/visualtest/docs/html/search/search.css
new file mode 100755
index 000000000..4d7612ff6
--- /dev/null
+++ b/visualtest/docs/html/search/search.css
@@ -0,0 +1,271 @@
+/*---------------- Search Box */
+
+#FSearchBox {
+ float: left;
+}
+
+#MSearchBox {
+ white-space : nowrap;
+ position: absolute;
+ float: none;
+ display: inline;
+ margin-top: 8px;
+ right: 0px;
+ width: 170px;
+ z-index: 102;
+ background-color: white;
+}
+
+#MSearchBox .left
+{
+ display:block;
+ position:absolute;
+ left:10px;
+ width:20px;
+ height:19px;
+ background:url('search_l.png') no-repeat;
+ background-position:right;
+}
+
+#MSearchSelect {
+ display:block;
+ position:absolute;
+ width:20px;
+ height:19px;
+}
+
+.left #MSearchSelect {
+ left:4px;
+}
+
+.right #MSearchSelect {
+ right:5px;
+}
+
+#MSearchField {
+ display:block;
+ position:absolute;
+ height:19px;
+ background:url('search_m.png') repeat-x;
+ border:none;
+ width:111px;
+ margin-left:20px;
+ padding-left:4px;
+ color: #909090;
+ outline: none;
+ font: 9pt Arial, Verdana, sans-serif;
+}
+
+#FSearchBox #MSearchField {
+ margin-left:15px;
+}
+
+#MSearchBox .right {
+ display:block;
+ position:absolute;
+ right:10px;
+ top:0px;
+ width:20px;
+ height:19px;
+ background:url('search_r.png') no-repeat;
+ background-position:left;
+}
+
+#MSearchClose {
+ display: none;
+ position: absolute;
+ top: 4px;
+ background : none;
+ border: none;
+ margin: 0px 4px 0px 0px;
+ padding: 0px 0px;
+ outline: none;
+}
+
+.left #MSearchClose {
+ left: 6px;
+}
+
+.right #MSearchClose {
+ right: 2px;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: #000000;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #90A5CE;
+ background-color: #F9FAFC;
+ z-index: 1;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+ font: 8pt Arial, Verdana, sans-serif;
+ padding-left: 2px;
+ padding-right: 12px;
+ border: 0px;
+}
+
+span.SelectionMark {
+ margin-right: 4px;
+ font-family: monospace;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem {
+ display: block;
+ outline-style: none;
+ color: #000000;
+ text-decoration: none;
+ padding-left: 6px;
+ padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+ color: #000000;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem:hover {
+ color: #FFFFFF;
+ background-color: #3D578C;
+ outline-style: none;
+ text-decoration: none;
+ cursor: pointer;
+ display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+ width: 60ex;
+ height: 15em;
+}
+
+#MSearchResultsWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #000;
+ background-color: #EEF1F7;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+ clear:both;
+ padding-bottom: 15px;
+}
+
+.SREntry {
+ font-size: 10pt;
+ padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+ font-size: 8pt;
+ padding: 1px 5px;
+}
+
+body.SRPage {
+ margin: 5px 2px;
+}
+
+.SRChildren {
+ padding-left: 3ex; padding-bottom: .5em
+}
+
+.SRPage .SRChildren {
+ display: none;
+}
+
+.SRSymbol {
+ font-weight: bold;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRScope {
+ display: block;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+ text-decoration: underline;
+}
+
+span.SRScope {
+ padding-left: 4px;
+}
+
+.SRPage .SRStatus {
+ padding: 2px 5px;
+ font-size: 8pt;
+ font-style: italic;
+}
+
+.SRResult {
+ display: none;
+}
+
+DIV.searchresults {
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+/*---------------- External search page results */
+
+.searchresult {
+ background-color: #F0F3F8;
+}
+
+.pages b {
+ color: white;
+ padding: 5px 5px 3px 5px;
+ background-image: url("../tab_a.png");
+ background-repeat: repeat-x;
+ text-shadow: 0 1px 1px #000000;
+}
+
+.pages {
+ line-height: 17px;
+ margin-left: 4px;
+ text-decoration: none;
+}
+
+.hl {
+ font-weight: bold;
+}
+
+#searchresults {
+ margin-bottom: 20px;
+}
+
+.searchpages {
+ margin-top: 10px;
+}
+
diff --git a/visualtest/docs/html/search/search.js b/visualtest/docs/html/search/search.js
new file mode 100755
index 000000000..e6bd04688
--- /dev/null
+++ b/visualtest/docs/html/search/search.js
@@ -0,0 +1,813 @@
+// Search script generated by doxygen
+// Copyright (C) 2009 by Dimitri van Heesch.
+
+// The code in this file is loosly based on main.js, part of Natural Docs,
+// which is Copyright (C) 2003-2008 Greg Valure
+// Natural Docs is licensed under the GPL.
+
+var indexSectionsWithContent =
+{
+ 0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111011011111101110110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000010001100101110110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111001000111101110100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 5: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 6: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 7: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 8: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000010100000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 9: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
+};
+
+var indexSectionNames =
+{
+ 0: "all",
+ 1: "classes",
+ 2: "files",
+ 3: "functions",
+ 4: "variables",
+ 5: "typedefs",
+ 6: "enums",
+ 7: "enumvalues",
+ 8: "defines",
+ 9: "pages"
+};
+
+function convertToId(search)
+{
+ var result = '';
+ for (i=0;i do a search
+ {
+ this.Search();
+ }
+ }
+
+ this.OnSearchSelectKey = function(evt)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 && this.searchIndex0) // Up
+ {
+ this.searchIndex--;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==13 || e.keyCode==27)
+ {
+ this.OnSelectItem(this.searchIndex);
+ this.CloseSelectionWindow();
+ this.DOMSearchField().focus();
+ }
+ return false;
+ }
+
+ // --------- Actions
+
+ // Closes the results window.
+ this.CloseResultsWindow = function()
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.Activate(false);
+ }
+
+ this.CloseSelectionWindow = function()
+ {
+ this.DOMSearchSelectWindow().style.display = 'none';
+ }
+
+ // Performs a search.
+ this.Search = function()
+ {
+ this.keyTimeout = 0;
+
+ // strip leading whitespace
+ var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+ var code = searchValue.toLowerCase().charCodeAt(0);
+ var hexCode;
+ if (code<16)
+ {
+ hexCode="0"+code.toString(16);
+ }
+ else
+ {
+ hexCode=code.toString(16);
+ }
+
+ var resultsPage;
+ var resultsPageWithSearch;
+ var hasResultsPage;
+
+ if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')
+ {
+ resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+ resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+ hasResultsPage = true;
+ }
+ else // nothing available for this search term
+ {
+ resultsPage = this.resultsPath + '/nomatches.html';
+ resultsPageWithSearch = resultsPage;
+ hasResultsPage = false;
+ }
+
+ window.frames.MSearchResults.location = resultsPageWithSearch;
+ var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ var domSearchBox = this.DOMSearchBox();
+ this.DOMSearchClose().style.display = 'inline';
+ if (this.insideFrame)
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ domPopupSearchResultsWindow.style.position = 'relative';
+ domPopupSearchResultsWindow.style.display = 'block';
+ var width = document.body.clientWidth - 8; // the -8 is for IE :-(
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ domPopupSearchResults.style.width = width + 'px';
+ }
+ else
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+ var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ }
+ }
+
+ this.lastSearchValue = searchValue;
+ this.lastResultsPage = resultsPage;
+ }
+
+ // -------- Activation Functions
+
+ // Activates or deactivates the search panel, resetting things to
+ // their default values if necessary.
+ this.Activate = function(isActive)
+ {
+ if (isActive || // open it
+ this.DOMPopupSearchResultsWindow().style.display == 'block'
+ )
+ {
+ this.DOMSearchBox().className = 'MSearchBoxActive';
+
+ var searchField = this.DOMSearchField();
+
+ if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+ {
+ searchField.value = '';
+ this.searchActive = true;
+ }
+ }
+ else if (!isActive) // directly remove the panel
+ {
+ this.DOMSearchBox().className = 'MSearchBoxInactive';
+ this.DOMSearchField().value = this.searchLabel;
+ this.searchActive = false;
+ this.lastSearchValue = ''
+ this.lastResultsPage = '';
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+ // The number of matches from the last run of .
+ this.lastMatchCount = 0;
+ this.lastKey = 0;
+ this.repeatOn = false;
+
+ // Toggles the visibility of the passed element ID.
+ this.FindChildElement = function(id)
+ {
+ var parentElement = document.getElementById(id);
+ var element = parentElement.firstChild;
+
+ while (element && element!=parentElement)
+ {
+ if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+ {
+ return element;
+ }
+
+ if (element.nodeName == 'DIV' && element.hasChildNodes())
+ {
+ element = element.firstChild;
+ }
+ else if (element.nextSibling)
+ {
+ element = element.nextSibling;
+ }
+ else
+ {
+ do
+ {
+ element = element.parentNode;
+ }
+ while (element && element!=parentElement && !element.nextSibling);
+
+ if (element && element!=parentElement)
+ {
+ element = element.nextSibling;
+ }
+ }
+ }
+ }
+
+ this.Toggle = function(id)
+ {
+ var element = this.FindChildElement(id);
+ if (element)
+ {
+ if (element.style.display == 'block')
+ {
+ element.style.display = 'none';
+ }
+ else
+ {
+ element.style.display = 'block';
+ }
+ }
+ }
+
+ // Searches for the passed string. If there is no parameter,
+ // it takes it from the URL query.
+ //
+ // Always returns true, since other documents may try to call it
+ // and that may or may not be possible.
+ this.Search = function(search)
+ {
+ if (!search) // get search word from URL
+ {
+ search = window.location.search;
+ search = search.substring(1); // Remove the leading '?'
+ search = unescape(search);
+ }
+
+ search = search.replace(/^ +/, ""); // strip leading spaces
+ search = search.replace(/ +$/, ""); // strip trailing spaces
+ search = search.toLowerCase();
+ search = convertToId(search);
+
+ var resultRows = document.getElementsByTagName("div");
+ var matches = 0;
+
+ var i = 0;
+ while (i < resultRows.length)
+ {
+ var row = resultRows.item(i);
+ if (row.className == "SRResult")
+ {
+ var rowMatchName = row.id.toLowerCase();
+ rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+ if (search.length<=rowMatchName.length &&
+ rowMatchName.substr(0, search.length)==search)
+ {
+ row.style.display = 'block';
+ matches++;
+ }
+ else
+ {
+ row.style.display = 'none';
+ }
+ }
+ i++;
+ }
+ document.getElementById("Searching").style.display='none';
+ if (matches == 0) // no results
+ {
+ document.getElementById("NoMatches").style.display='block';
+ }
+ else // at least one result
+ {
+ document.getElementById("NoMatches").style.display='none';
+ }
+ this.lastMatchCount = matches;
+ return true;
+ }
+
+ // return the first item with index index or higher that is visible
+ this.NavNext = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index++;
+ }
+ return focusItem;
+ }
+
+ this.NavPrev = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index--;
+ }
+ return focusItem;
+ }
+
+ this.ProcessKeys = function(e)
+ {
+ if (e.type == "keydown")
+ {
+ this.repeatOn = false;
+ this.lastKey = e.keyCode;
+ }
+ else if (e.type == "keypress")
+ {
+ if (!this.repeatOn)
+ {
+ if (this.lastKey) this.repeatOn = true;
+ return false; // ignore first keypress after keydown
+ }
+ }
+ else if (e.type == "keyup")
+ {
+ this.lastKey = 0;
+ this.repeatOn = false;
+ }
+ return this.lastKey!=0;
+ }
+
+ this.Nav = function(evt,itemIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ var newIndex = itemIndex-1;
+ var focusItem = this.NavPrev(newIndex);
+ if (focusItem)
+ {
+ var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+ if (child && child.style.display == 'block') // children visible
+ {
+ var n=0;
+ var tmpElem;
+ while (1) // search for last child
+ {
+ tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+ if (tmpElem)
+ {
+ focusItem = tmpElem;
+ }
+ else // found it!
+ {
+ break;
+ }
+ n++;
+ }
+ }
+ }
+ if (focusItem)
+ {
+ focusItem.focus();
+ }
+ else // return focus to search field
+ {
+ parent.document.getElementById("MSearchField").focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = itemIndex+1;
+ var focusItem;
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem && elem.style.display == 'block') // children visible
+ {
+ focusItem = document.getElementById('Item'+itemIndex+'_c0');
+ }
+ if (!focusItem) focusItem = this.NavNext(newIndex);
+ if (focusItem) focusItem.focus();
+ }
+ else if (this.lastKey==39) // Right
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'block';
+ }
+ else if (this.lastKey==37) // Left
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'none';
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+
+ this.NavChild = function(evt,itemIndex,childIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ if (childIndex>0)
+ {
+ var newIndex = childIndex-1;
+ document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+ }
+ else // already at first child, jump to parent
+ {
+ document.getElementById('Item'+itemIndex).focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = childIndex+1;
+ var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+ if (!elem) // last child, jump to parent next parent
+ {
+ elem = this.NavNext(itemIndex+1);
+ }
+ if (elem)
+ {
+ elem.focus();
+ }
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+}
+
+function setKeyActions(elem,action)
+{
+ elem.setAttribute('onkeydown',action);
+ elem.setAttribute('onkeypress',action);
+ elem.setAttribute('onkeyup',action);
+}
+
+function setClassAttr(elem,attr)
+{
+ elem.setAttribute('class',attr);
+ elem.setAttribute('className',attr);
+}
+
+function createResults()
+{
+ var results = document.getElementById("SRResults");
+ for (var e=0; e
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/typedefs_73.js b/visualtest/docs/html/search/typedefs_73.js
new file mode 100755
index 000000000..383282f9d
--- /dev/null
+++ b/visualtest/docs/html/search/typedefs_73.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['sdl_5fprocessexitstatus',['SDL_ProcessExitStatus',['../_s_d_l__visualtest__process_8h.html#a5b7d5262f85e78bf4d53d88f3c509342',1,'SDL_visualtest_process.h']]],
+ ['sdl_5fprocessinfo',['SDL_ProcessInfo',['../_s_d_l__visualtest__process_8h.html#a94bc9e0b0b563a527ea50ef2eecd5402',1,'SDL_visualtest_process.h']]],
+ ['sdlvisualtest_5faction',['SDLVisualTest_Action',['../_s_d_l__visualtest__action__configparser_8h.html#a89974e9149bfca6aabb3ff06cc9671d7',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdlvisualtest_5factionnode',['SDLVisualTest_ActionNode',['../_s_d_l__visualtest__action__configparser_8h.html#a065d1acf0f98bde777d10bd8ab24d268',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdlvisualtest_5factionqueue',['SDLVisualTest_ActionQueue',['../_s_d_l__visualtest__action__configparser_8h.html#ac9ce1bb69d8774d1818c9f9d0f97c7f1',1,'SDL_visualtest_action_configparser.h']]],
+ ['sdlvisualtest_5fexhaustivevariator',['SDLVisualTest_ExhaustiveVariator',['../_s_d_l__visualtest__exhaustive__variator_8h.html#ab64de6cf7d6a1e6d09d470c020940c25',1,'SDL_visualtest_exhaustive_variator.h']]],
+ ['sdlvisualtest_5fharnessstate',['SDLVisualTest_HarnessState',['../_s_d_l__visualtest__harness__argparser_8h.html#ab89725ad0ec988d4923faa6a85972455',1,'SDL_visualtest_harness_argparser.h']]],
+ ['sdlvisualtest_5frandomvariator',['SDLVisualTest_RandomVariator',['../_s_d_l__visualtest__random__variator_8h.html#ab0df6ee6ec21b5070bfd8e90a7d79974',1,'SDL_visualtest_random_variator.h']]],
+ ['sdlvisualtest_5fsutconfig',['SDLVisualTest_SUTConfig',['../_s_d_l__visualtest__sut__configparser_8h.html#a1b493a40d601932b62ee643390aec169',1,'SDL_visualtest_sut_configparser.h']]],
+ ['sdlvisualtest_5fsutintrange',['SDLVisualTest_SUTIntRange',['../_s_d_l__visualtest__sut__configparser_8h.html#a8cbe93330b2ce59cdf6da59e2eca6045',1,'SDL_visualtest_sut_configparser.h']]],
+ ['sdlvisualtest_5fsutoption',['SDLVisualTest_SUTOption',['../_s_d_l__visualtest__sut__configparser_8h.html#a9f35b5fe1ce4ba831a9b9e1f2bc8b7f6',1,'SDL_visualtest_sut_configparser.h']]],
+ ['sdlvisualtest_5fsutoptionvalue',['SDLVisualTest_SUTOptionValue',['../_s_d_l__visualtest__variator__common_8h.html#aa4e5fb752f4cd087101ea3e1f6124dfb',1,'SDL_visualtest_variator_common.h']]],
+ ['sdlvisualtest_5fvariation',['SDLVisualTest_Variation',['../_s_d_l__visualtest__variator__common_8h.html#a6b447c1467862ecd623cc8f37489faeb',1,'SDL_visualtest_variator_common.h']]],
+ ['sdlvisualtest_5fvariator',['SDLVisualTest_Variator',['../_s_d_l__visualtest__variators_8h.html#a520a2479efbe9c4a9d617735f7314e0a',1,'SDL_visualtest_variators.h']]],
+ ['sdlvisualtest_5fvariatortype',['SDLVisualTest_VariatorType',['../_s_d_l__visualtest__variator__common_8h.html#a4a7752dc89880ce3f62a478b3d0d8d64',1,'SDL_visualtest_variator_common.h']]]
+];
diff --git a/visualtest/docs/html/search/variables_61.html b/visualtest/docs/html/search/variables_61.html
new file mode 100755
index 000000000..cbd2c67aa
--- /dev/null
+++ b/visualtest/docs/html/search/variables_61.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_61.js b/visualtest/docs/html/search/variables_61.js
new file mode 100755
index 000000000..759aa184c
--- /dev/null
+++ b/visualtest/docs/html/search/variables_61.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['action',['action',['../struct_s_d_l_visual_test___action_node.html#af46ec45094cc74a7432626a6234c6575',1,'SDLVisualTest_ActionNode']]],
+ ['action_5fqueue',['action_queue',['../struct_s_d_l_visual_test___harness_state.html#ae25567527563fbd7373fa1cf7cdede61',1,'SDLVisualTest_HarnessState']]]
+];
diff --git a/visualtest/docs/html/search/variables_62.html b/visualtest/docs/html/search/variables_62.html
new file mode 100755
index 000000000..9c2628f7f
--- /dev/null
+++ b/visualtest/docs/html/search/variables_62.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_62.js b/visualtest/docs/html/search/variables_62.js
new file mode 100755
index 000000000..d614f7b3f
--- /dev/null
+++ b/visualtest/docs/html/search/variables_62.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['bool_5fvalue',['bool_value',['../union_s_d_l_visual_test___s_u_t_option_value.html#ace8ec6519c056e35443a6c401f3d0941',1,'SDLVisualTest_SUTOptionValue']]],
+ ['buffer',['buffer',['../struct_s_d_l_visual_test___exhaustive_variator.html#a2b599af5b00be0f525ffc18feb0775a8',1,'SDLVisualTest_ExhaustiveVariator::buffer()'],['../struct_s_d_l_visual_test___random_variator.html#a2b599af5b00be0f525ffc18feb0775a8',1,'SDLVisualTest_RandomVariator::buffer()'],['../struct_s_d_l_visual_test___r_w_helper_buffer.html#a5b528063c1aaa0e626f5d5e49de5baad',1,'SDLVisualTest_RWHelperBuffer::buffer()']]],
+ ['buffer_5fpos',['buffer_pos',['../struct_s_d_l_visual_test___r_w_helper_buffer.html#a8a37d41b7b076eced766d7418450477d',1,'SDLVisualTest_RWHelperBuffer']]],
+ ['buffer_5fwidth',['buffer_width',['../struct_s_d_l_visual_test___r_w_helper_buffer.html#adb2920cd89b7b8b8b014290e82746d8c',1,'SDLVisualTest_RWHelperBuffer']]]
+];
diff --git a/visualtest/docs/html/search/variables_63.html b/visualtest/docs/html/search/variables_63.html
new file mode 100755
index 000000000..ea9fcda5f
--- /dev/null
+++ b/visualtest/docs/html/search/variables_63.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_63.js b/visualtest/docs/html/search/variables_63.js
new file mode 100755
index 000000000..dcc5243ac
--- /dev/null
+++ b/visualtest/docs/html/search/variables_63.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['categories',['categories',['../struct_s_d_l_visual_test___s_u_t_option.html#a6744d43d3ad17d06068dba9ee7b78c83',1,'SDLVisualTest_SUTOption']]],
+ ['config',['config',['../struct_s_d_l_visual_test___exhaustive_variator.html#ab66b4220589b2e2b6e1fde7d6c20bd72',1,'SDLVisualTest_ExhaustiveVariator::config()'],['../struct_s_d_l_visual_test___random_variator.html#ab66b4220589b2e2b6e1fde7d6c20bd72',1,'SDLVisualTest_RandomVariator::config()']]]
+];
diff --git a/visualtest/docs/html/search/variables_64.html b/visualtest/docs/html/search/variables_64.html
new file mode 100755
index 000000000..87ccbcc8e
--- /dev/null
+++ b/visualtest/docs/html/search/variables_64.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_64.js b/visualtest/docs/html/search/variables_64.js
new file mode 100755
index 000000000..738e92dfb
--- /dev/null
+++ b/visualtest/docs/html/search/variables_64.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['data',['data',['../struct_s_d_l_visual_test___s_u_t_option.html#aa9545bd4acd476f61533d04d53cdffdc',1,'SDLVisualTest_SUTOption::data()'],['../struct_s_d_l_visual_test___variator.html#af99a8790e729d599c656a2070e672e9a',1,'SDLVisualTest_Variator::data()']]]
+];
diff --git a/visualtest/docs/html/search/variables_65.html b/visualtest/docs/html/search/variables_65.html
new file mode 100755
index 000000000..9b98f6656
--- /dev/null
+++ b/visualtest/docs/html/search/variables_65.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_65.js b/visualtest/docs/html/search/variables_65.js
new file mode 100755
index 000000000..f1c225b11
--- /dev/null
+++ b/visualtest/docs/html/search/variables_65.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['enum_5fvalues',['enum_values',['../struct_s_d_l_visual_test___s_u_t_option.html#a596ff3567c4b736561dba1915a2cd38d',1,'SDLVisualTest_SUTOption']]],
+ ['enumerated',['enumerated',['../union_s_d_l_visual_test___s_u_t_option_value.html#ad40e26afd4b8532327b61897d5b009e3',1,'SDLVisualTest_SUTOptionValue']]],
+ ['exit_5fstatus',['exit_status',['../struct_s_d_l___process_exit_status.html#a9324a9ff7dc6697dd77f02998d5e77d7',1,'SDL_ProcessExitStatus']]],
+ ['exit_5fsuccess',['exit_success',['../struct_s_d_l___process_exit_status.html#a51df50c07437f2e816d6ce7ce99e1cac',1,'SDL_ProcessExitStatus']]],
+ ['extra',['extra',['../struct_s_d_l_visual_test___action.html#a4626514a67f261290b54fb3d85ca8ddd',1,'SDLVisualTest_Action']]]
+];
diff --git a/visualtest/docs/html/search/variables_66.html b/visualtest/docs/html/search/variables_66.html
new file mode 100755
index 000000000..67d53d8b6
--- /dev/null
+++ b/visualtest/docs/html/search/variables_66.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_66.js b/visualtest/docs/html/search/variables_66.js
new file mode 100755
index 000000000..d89c38030
--- /dev/null
+++ b/visualtest/docs/html/search/variables_66.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['front',['front',['../struct_s_d_l_visual_test___action_queue.html#a8b810b2fd2b05698be642ee08836a452',1,'SDLVisualTest_ActionQueue']]]
+];
diff --git a/visualtest/docs/html/search/variables_69.html b/visualtest/docs/html/search/variables_69.html
new file mode 100755
index 000000000..941e60775
--- /dev/null
+++ b/visualtest/docs/html/search/variables_69.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_69.js b/visualtest/docs/html/search/variables_69.js
new file mode 100755
index 000000000..d88f651d5
--- /dev/null
+++ b/visualtest/docs/html/search/variables_69.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['integer',['integer',['../union_s_d_l_visual_test___s_u_t_option_value.html#a4291d9ad3cfb3fe1645ea2732e11d68a',1,'SDLVisualTest_SUTOptionValue']]]
+];
diff --git a/visualtest/docs/html/search/variables_6d.html b/visualtest/docs/html/search/variables_6d.html
new file mode 100755
index 000000000..ca885469b
--- /dev/null
+++ b/visualtest/docs/html/search/variables_6d.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_6d.js b/visualtest/docs/html/search/variables_6d.js
new file mode 100755
index 000000000..0115904f4
--- /dev/null
+++ b/visualtest/docs/html/search/variables_6d.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['max',['max',['../struct_s_d_l_visual_test___s_u_t_int_range.html#ae1e1dde676c120fa6d10f3bb2c14059e',1,'SDLVisualTest_SUTIntRange']]],
+ ['min',['min',['../struct_s_d_l_visual_test___s_u_t_int_range.html#a3e202b201e6255d975cd6d3aff1f5a4d',1,'SDLVisualTest_SUTIntRange']]]
+];
diff --git a/visualtest/docs/html/search/variables_6e.html b/visualtest/docs/html/search/variables_6e.html
new file mode 100755
index 000000000..e0813cf1a
--- /dev/null
+++ b/visualtest/docs/html/search/variables_6e.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_6e.js b/visualtest/docs/html/search/variables_6e.js
new file mode 100755
index 000000000..7f7530572
--- /dev/null
+++ b/visualtest/docs/html/search/variables_6e.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['name',['name',['../struct_s_d_l_visual_test___s_u_t_option.html#ad14ca616d8f7c9b61eff58baaead7f1f',1,'SDLVisualTest_SUTOption']]],
+ ['next',['next',['../struct_s_d_l_visual_test___action_node.html#ae6154b60b896ce1a184d060ee4664485',1,'SDLVisualTest_ActionNode']]],
+ ['no_5flaunch',['no_launch',['../struct_s_d_l_visual_test___harness_state.html#a091c0d08290b73216a736ff42ac8fa99',1,'SDLVisualTest_HarnessState']]],
+ ['num_5foptions',['num_options',['../struct_s_d_l_visual_test___s_u_t_config.html#a593108c2cc4b7dd3edecefd724edfd51',1,'SDLVisualTest_SUTConfig']]],
+ ['num_5fvariations',['num_variations',['../struct_s_d_l_visual_test___harness_state.html#a0bd4e04c0c6be7b94e68501bb31dd62c',1,'SDLVisualTest_HarnessState']]],
+ ['num_5fvars',['num_vars',['../struct_s_d_l_visual_test___variation.html#a2daded0b80f9ab7ed3703cc2686e5a92',1,'SDLVisualTest_Variation']]]
+];
diff --git a/visualtest/docs/html/search/variables_6f.html b/visualtest/docs/html/search/variables_6f.html
new file mode 100755
index 000000000..a67864b54
--- /dev/null
+++ b/visualtest/docs/html/search/variables_6f.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_6f.js b/visualtest/docs/html/search/variables_6f.js
new file mode 100755
index 000000000..35f6f8542
--- /dev/null
+++ b/visualtest/docs/html/search/variables_6f.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['options',['options',['../struct_s_d_l_visual_test___s_u_t_config.html#afda1bef370f3d5ea6919b7b6a73d01c0',1,'SDLVisualTest_SUTConfig']]],
+ ['output_5fdir',['output_dir',['../struct_s_d_l_visual_test___harness_state.html#aafa9a2fb15490380b6c2edd704f4fcf0',1,'SDLVisualTest_HarnessState']]]
+];
diff --git a/visualtest/docs/html/search/variables_70.html b/visualtest/docs/html/search/variables_70.html
new file mode 100755
index 000000000..091e4bf8d
--- /dev/null
+++ b/visualtest/docs/html/search/variables_70.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_70.js b/visualtest/docs/html/search/variables_70.js
new file mode 100755
index 000000000..f86764237
--- /dev/null
+++ b/visualtest/docs/html/search/variables_70.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['process',['process',['../struct_s_d_l_visual_test___action.html#aa43e9883c9f24718f49b984b67b1afdc',1,'SDLVisualTest_Action']]]
+];
diff --git a/visualtest/docs/html/search/variables_72.html b/visualtest/docs/html/search/variables_72.html
new file mode 100755
index 000000000..0e513f2d8
--- /dev/null
+++ b/visualtest/docs/html/search/variables_72.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_72.js b/visualtest/docs/html/search/variables_72.js
new file mode 100755
index 000000000..2be3738ac
--- /dev/null
+++ b/visualtest/docs/html/search/variables_72.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['range',['range',['../struct_s_d_l_visual_test___s_u_t_option.html#a2bb1301268866e0e41d035ea0a4914e8',1,'SDLVisualTest_SUTOption']]],
+ ['rear',['rear',['../struct_s_d_l_visual_test___action_queue.html#a4aaf4563956932c81c65d05f9020f2ce',1,'SDLVisualTest_ActionQueue']]],
+ ['required',['required',['../struct_s_d_l_visual_test___s_u_t_option.html#a79305c1b10f7b4defee52e1eefde8fbc',1,'SDLVisualTest_SUTOption']]]
+];
diff --git a/visualtest/docs/html/search/variables_73.html b/visualtest/docs/html/search/variables_73.html
new file mode 100755
index 000000000..3c65150e4
--- /dev/null
+++ b/visualtest/docs/html/search/variables_73.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_73.js b/visualtest/docs/html/search/variables_73.js
new file mode 100755
index 000000000..4ed001669
--- /dev/null
+++ b/visualtest/docs/html/search/variables_73.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['size',['size',['../struct_s_d_l_visual_test___action_queue.html#a439227feff9d7f55384e8780cfc2eb82',1,'SDLVisualTest_ActionQueue']]],
+ ['string',['string',['../union_s_d_l_visual_test___s_u_t_option_value.html#a2bf4b969ff9633c937e4d15118d1edc6',1,'SDLVisualTest_SUTOptionValue']]],
+ ['sut_5fconfig',['sut_config',['../struct_s_d_l_visual_test___harness_state.html#a42657080015a96da836e1640bbdf870e',1,'SDLVisualTest_HarnessState']]],
+ ['sutapp',['sutapp',['../struct_s_d_l_visual_test___harness_state.html#af277bbb5c712eb89e92337dd583a8b74',1,'SDLVisualTest_HarnessState']]],
+ ['sutargs',['sutargs',['../struct_s_d_l_visual_test___harness_state.html#a00fab9c7cf802b96b6b29e098292d24d',1,'SDLVisualTest_HarnessState']]]
+];
diff --git a/visualtest/docs/html/search/variables_74.html b/visualtest/docs/html/search/variables_74.html
new file mode 100755
index 000000000..3a0726b44
--- /dev/null
+++ b/visualtest/docs/html/search/variables_74.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_74.js b/visualtest/docs/html/search/variables_74.js
new file mode 100755
index 000000000..75a24382f
--- /dev/null
+++ b/visualtest/docs/html/search/variables_74.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['time',['time',['../struct_s_d_l_visual_test___action.html#a42715f65f02da52edc5b22021d8ae670',1,'SDLVisualTest_Action']]],
+ ['timeout',['timeout',['../struct_s_d_l_visual_test___harness_state.html#a493b57f443cc38b3d3df9c1e584d9d82',1,'SDLVisualTest_HarnessState']]],
+ ['type',['type',['../struct_s_d_l_visual_test___action.html#a3ab091b672fc470015f09e6c4c50dcf1',1,'SDLVisualTest_Action::type()'],['../struct_s_d_l_visual_test___s_u_t_option.html#a857b9e5ccfca26034b47a5f3236d822c',1,'SDLVisualTest_SUTOption::type()'],['../struct_s_d_l_visual_test___variator.html#a24d4399dc1877c1843e120e7b027ae64',1,'SDLVisualTest_Variator::type()']]]
+];
diff --git a/visualtest/docs/html/search/variables_76.html b/visualtest/docs/html/search/variables_76.html
new file mode 100755
index 000000000..cccf85023
--- /dev/null
+++ b/visualtest/docs/html/search/variables_76.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
Searching...
+
No Matches
+
+
+
+
diff --git a/visualtest/docs/html/search/variables_76.js b/visualtest/docs/html/search/variables_76.js
new file mode 100755
index 000000000..fc860d9f8
--- /dev/null
+++ b/visualtest/docs/html/search/variables_76.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['variation',['variation',['../struct_s_d_l_visual_test___exhaustive_variator.html#a11c2995cf19b41c4a1b1f8d9b4081ff7',1,'SDLVisualTest_ExhaustiveVariator::variation()'],['../struct_s_d_l_visual_test___random_variator.html#a11c2995cf19b41c4a1b1f8d9b4081ff7',1,'SDLVisualTest_RandomVariator::variation()']]],
+ ['variator_5ftype',['variator_type',['../struct_s_d_l_visual_test___harness_state.html#aaaa989ae89caee6d39c722cfe6907466',1,'SDLVisualTest_HarnessState']]],
+ ['vars',['vars',['../struct_s_d_l_visual_test___variation.html#a1eab2e90f0195b4f4632eb19523aeadf',1,'SDLVisualTest_Variation']]],
+ ['verify_5fdir',['verify_dir',['../struct_s_d_l_visual_test___harness_state.html#adc871112f24f61e2fff74a7a7fb9794f',1,'SDLVisualTest_HarnessState']]]
+];
diff --git a/visualtest/docs/html/struct_s_d_l___process_exit_status.html b/visualtest/docs/html/struct_s_d_l___process_exit_status.html
new file mode 100755
index 000000000..eb72824f6
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l___process_exit_status.html
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+SDL Visual Test: SDL_ProcessExitStatus Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_process.h >
+
+
+
This structure stores the exit status (value returned by main() ) and whether the process exited sucessfully or not.
+
+
+
+
+
The exit status of the process. 8-bit value.
+
+
+
+
+
+
+
Zero if the process exited successfully
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l___process_info.html b/visualtest/docs/html/struct_s_d_l___process_info.html
new file mode 100755
index 000000000..2287670c2
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l___process_info.html
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+SDL Visual Test: SDL_ProcessInfo Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_process.h >
+
+
Struct to store a platform specific handle to a process.
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___action.html b/visualtest/docs/html/struct_s_d_l_visual_test___action.html
new file mode 100755
index 000000000..8e136641e
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___action.html
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_Action Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_action_configparser.h >
+
+
+
Struct that defines an action that will be performed on the SUT process at a specific time.
+
+
+
+
+
+
+ union { ... } extra
+
+
+
+
Any additional information needed to perform the action.
+
+
+
+
+
+
+
+
+ struct { ... } process
+
+
+
+
The path and arguments to the process to be launched
+
+
+
+
+
+
+
The time, in milliseconds from the launch of the SUT, when the action will be performed
+
+
+
+
+
+
+
The type of action to be performed
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___action_node.html b/visualtest/docs/html/struct_s_d_l_visual_test___action_node.html
new file mode 100755
index 000000000..28e75e487
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___action_node.html
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_ActionNode Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_action_configparser.h >
+
+
+
Struct for a node in the action queue.
+
+
+
+
+
The action in this node
+
+
+
+
+
+
+
Pointer to the next element in the queue
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___action_queue.html b/visualtest/docs/html/struct_s_d_l_visual_test___action_queue.html
new file mode 100755
index 000000000..8292dcd9e
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___action_queue.html
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_ActionQueue Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_action_configparser.h >
+
+
+
Queue structure for actions loaded from the actions config file.
+
+
+
+
+
Pointer to the front of the queue
+
+
+
+
+
+
+
Pointer to the rear of the queue
+
+
+
+
+
+
+
Number of nodes in the queue
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___exhaustive_variator.html b/visualtest/docs/html/struct_s_d_l_visual_test___exhaustive_variator.html
new file mode 100755
index 000000000..12b472c3a
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___exhaustive_variator.html
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_ExhaustiveVariator Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_exhaustive_variator.h >
+
+
+
Struct for the variator that exhaustively iterates through all variations of command line arguments to the SUT.
+
+
+
+
+
Buffer to store the arguments string built from the variation
+
+
+
+
+
+
+
Configuration object for the SUT that the variator is running for.
+
+
+
+
+
+
+
The current variation.
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___harness_state.html b/visualtest/docs/html/struct_s_d_l_visual_test___harness_state.html
new file mode 100755
index 000000000..a8db4701c
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___harness_state.html
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_HarnessState Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_harness_argparser.h >
+
+
+
Stores the state of the test harness.
+
+
+
+
+
A queue with actions to be performed while the SUT is running
+
+
+
+
+
+
+
+
+ SDL_bool no_launch
+
+
+
+
If true, the test harness will just print the different variations without launching the SUT for each one
+
+
+
+
+
+
+
+
+ int num_variations
+
+
+
+
The number of variations to generate
+
+
+
+
+
+
+
Output directory to save the screenshots
+
+
+
+
+
+
+
Configuration object for the SUT
+
+
+
+
+
+
+
Path to the System Under Test (SUT) executable
+
+
+
+
+
+
+
Command line arguments to be passed to the SUT
+
+
+
+
+
+
+
Time in milliseconds after which to kill the SUT
+
+
+
+
+
+
+
What type of variator to use to generate argument strings
+
+
+
+
+
+
+
Path to directory with the verification images
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___r_w_helper_buffer.html b/visualtest/docs/html/struct_s_d_l_visual_test___r_w_helper_buffer.html
new file mode 100755
index 000000000..35a713908
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___r_w_helper_buffer.html
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_RWHelperBuffer Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_rwhelper.h >
+
+
+
Struct that is used as a buffer by the RW helper functions. Should be initialized by calling SDLVisualTest_RWHelperResetBuffer() before being used.
+
+
+
+
+
+
+ char buffer[RWOPS_BUFFER_LEN]
+
+
+
+
Character buffer that data is read into
+
+
+
+
+
+
+
buffer[buffer_pos] is the next character to be read from the buffer
+
+
+
+
+
+
+
Number of character read into the buffer
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___random_variator.html b/visualtest/docs/html/struct_s_d_l_visual_test___random_variator.html
new file mode 100755
index 000000000..13a96fdb4
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___random_variator.html
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_RandomVariator Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_random_variator.h >
+
+
+
Struct for the variator that randomly generates variations of command line arguments to the SUT.
+
+
+
+
+
Buffer to store the arguments string built from the variation
+
+
+
+
+
+
+
Configuration object for the SUT that the variator is running for.
+
+
+
+
+
+
+
The current variation.
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___s_u_t_config.html b/visualtest/docs/html/struct_s_d_l_visual_test___s_u_t_config.html
new file mode 100755
index 000000000..0d4b6d09a
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___s_u_t_config.html
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_SUTConfig Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_sut_configparser.h >
+
+
+
Struct to hold all the options to an SUT application.
+
+
+
+
+
Number of options in options
+
+
+
+
+
+
+
Pointer to an array of options
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___s_u_t_int_range.html b/visualtest/docs/html/struct_s_d_l_visual_test___s_u_t_int_range.html
new file mode 100755
index 000000000..8d96bd0ed
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___s_u_t_int_range.html
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_SUTIntRange Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_sut_configparser.h >
+
+
+
Represents the range of values an integer option can take.
+
+
+
+
+
Maximum value of the integer option
+
+
+
+
+
+
+
Minimum value of the integer option
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___s_u_t_option.html b/visualtest/docs/html/struct_s_d_l_visual_test___s_u_t_option.html
new file mode 100755
index 000000000..db0e19ed8
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___s_u_t_option.html
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_SUTOption Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_sut_configparser.h >
+
+
+
Struct that defines an option to be passed to the SUT.
+
+
+
+
+
+
+ char** categories
+
+
+
+
An array of categories that the option belongs to. The last element is NULL.
+
+
+
+
+
+
+
+
+ union { ... } data
+
+
+
+
extra data that is required for certain types
+
+
+
+
+
+
+
+
+ char** enum_values
+
+
+
+
This field is valid only for enum type options; it holds the list of values
+ that the option can take. The last element is NULL
+
+
+
+
+
+
+
The name of the option. This is what you would pass in the command line along with two leading hyphens.
+
+
+
+
+
+
+
This field is valid only for integer type options; it defines the
+ valid range for such an option
+
+
+
+
+
+
+
+
+ SDL_bool required
+
+
+
+
Whether the option is required or not
+
+
+
+
+
+
+
Type of the option - integer, boolean, etc.
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___variation.html b/visualtest/docs/html/struct_s_d_l_visual_test___variation.html
new file mode 100755
index 000000000..c48f02214
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___variation.html
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_Variation Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_variator_common.h >
+
+
+
Represents a valid combination of parameters that can be passed to the SUT. The ordering of the values here is the same as the ordering of the options in the SDLVisualTest_SUTConfig object for this variation.
+
+
+
+
+
Number of option values in vars
+
+
+
+
+
+
+
Pointer to array of option values
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/struct_s_d_l_visual_test___variator.html b/visualtest/docs/html/struct_s_d_l_visual_test___variator.html
new file mode 100755
index 000000000..4ba116986
--- /dev/null
+++ b/visualtest/docs/html/struct_s_d_l_visual_test___variator.html
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_Variator Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_variators.h >
+
+
+
Struct that acts like a wrapper around the different types of variators available.
+
+
+
+
+
+
+ union { ... } data
+
+
+
+
union object that stores the variator
+
+
+
+
+
+
+
Type of the variator
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/sut__configparser_8c.html b/visualtest/docs/html/sut__configparser_8c.html
new file mode 100755
index 000000000..341ab1427
--- /dev/null
+++ b/visualtest/docs/html/sut__configparser_8c.html
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/sut_configparser.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <limits.h>
+
#include <string.h>
+
#include <SDL_test.h>
+
#include <SDL_rwops.h>
+
#include "SDL_visualtest_sut_configparser.h "
+
#include "SDL_visualtest_parsehelper.h "
+
#include "SDL_visualtest_rwhelper.h"
+
+
+
Source file for the parser for SUT config files.
+
+
+
+
+
Free any resources associated with the config object pointed to by config
.
+
+
+
+
+
+
+
+
+ int SDLVisualTest_ParseSUTConfig
+ (
+ char *
+ file ,
+
+
+
+
+ SDLVisualTest_SUTConfig *
+ config
+
+
+
+ )
+
+
+
+
+
Parses a configuration file that describes the command line options an SUT application will take and populates a SUT config object. All lines in the config file must be smaller than
+
Parameters
+
+ file Path to the configuration file.
+ config Pointer to an object that represents an SUT configuration.
+
+
+
+
Returns zero on failure, non-zero on success
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/sync_off.png b/visualtest/docs/html/sync_off.png
new file mode 100755
index 000000000..3b443fc62
Binary files /dev/null and b/visualtest/docs/html/sync_off.png differ
diff --git a/visualtest/docs/html/sync_on.png b/visualtest/docs/html/sync_on.png
new file mode 100755
index 000000000..e08320fb6
Binary files /dev/null and b/visualtest/docs/html/sync_on.png differ
diff --git a/visualtest/docs/html/tab_a.png b/visualtest/docs/html/tab_a.png
new file mode 100755
index 000000000..3b725c41c
Binary files /dev/null and b/visualtest/docs/html/tab_a.png differ
diff --git a/visualtest/docs/html/tab_b.png b/visualtest/docs/html/tab_b.png
new file mode 100755
index 000000000..e2b4a8638
Binary files /dev/null and b/visualtest/docs/html/tab_b.png differ
diff --git a/visualtest/docs/html/tab_h.png b/visualtest/docs/html/tab_h.png
new file mode 100755
index 000000000..fd5cb7054
Binary files /dev/null and b/visualtest/docs/html/tab_h.png differ
diff --git a/visualtest/docs/html/tab_s.png b/visualtest/docs/html/tab_s.png
new file mode 100755
index 000000000..ab478c95b
Binary files /dev/null and b/visualtest/docs/html/tab_s.png differ
diff --git a/visualtest/docs/html/tabs.css b/visualtest/docs/html/tabs.css
new file mode 100755
index 000000000..9cf578f23
--- /dev/null
+++ b/visualtest/docs/html/tabs.css
@@ -0,0 +1,60 @@
+.tabs, .tabs2, .tabs3 {
+ background-image: url('tab_b.png');
+ width: 100%;
+ z-index: 101;
+ font-size: 13px;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+.tabs2 {
+ font-size: 10px;
+}
+.tabs3 {
+ font-size: 9px;
+}
+
+.tablist {
+ margin: 0;
+ padding: 0;
+ display: table;
+}
+
+.tablist li {
+ float: left;
+ display: table-cell;
+ background-image: url('tab_b.png');
+ line-height: 36px;
+ list-style: none;
+}
+
+.tablist a {
+ display: block;
+ padding: 0 20px;
+ font-weight: bold;
+ background-image:url('tab_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color: #283A5D;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+ outline: none;
+}
+
+.tabs3 .tablist a {
+ padding: 0 10px;
+}
+
+.tablist a:hover {
+ background-image: url('tab_h.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-decoration: none;
+}
+
+.tablist li.current a {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
diff --git a/visualtest/docs/html/testharness_8c.html b/visualtest/docs/html/testharness_8c.html
new file mode 100755
index 000000000..ccef4845e
--- /dev/null
+++ b/visualtest/docs/html/testharness_8c.html
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/testharness.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <stdlib.h>
+
#include <SDL_test.h>
+
#include <SDL.h>
+
#include <SDL_assert.h>
+
#include "SDL_visualtest_harness_argparser.h "
+
#include "SDL_visualtest_process.h "
+
#include "SDL_visualtest_variators.h "
+
#include "SDL_visualtest_screenshot.h "
+
#include "SDL_visualtest_mischelper.h"
+
+
+int main (int argc, char *argv[])
+
+
+
+
Source file for the test harness.
+
+
+
+
+
+
+ #define ACTION_LOOP_FPS 10
+
+
+
+
FPS value used for delays in the action loop
+
+
+
+
+
+
+
+
+ #define ACTION_TIMER_EVENT 0
+
+
+
+
Code for the user event triggered when a new action is to be executed
+
+
+
+
+
+
+
+
+ #define KILL_TIMER_EVENT 1
+
+
+
+
Code for the user event triggered when the maximum timeout is reached
+
+
+
+
+
+
+
+
+ #define TEST_ERROR -1
+
+
+
+
Value returned by RunSUTAndTest() on a fatal error
+
+
+
+
+
+
+
+
+ #define TEST_FAILED 0
+
+
+
+
Value returned by RunSUTAndTest() when the test has failed
+
+
+
+
+
+
+
+
+ #define TEST_PASSED 1
+
+
+
+
Value returned by RunSUTAndTest() when the test has passed
+
+
+
+
+
+
+
+
+
+ int main
+ (
+ int
+ argc ,
+
+
+
+
+ char *
+ argv []
+
+
+
+ )
+
+
+
+
+
Entry point for testharness
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/union_s_d_l_visual_test___s_u_t_option_value.html b/visualtest/docs/html/union_s_d_l_visual_test___s_u_t_option_value.html
new file mode 100755
index 000000000..2cab3efc2
--- /dev/null
+++ b/visualtest/docs/html/union_s_d_l_visual_test___s_u_t_option_value.html
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+SDL Visual Test: SDLVisualTest_SUTOptionValue Union Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_visualtest_variator_common.h >
+
+
+SDL_bool bool_value
+
+struct {
+ int value
+
+ SDL_bool on
+
+} integer
+
+struct {
+ int index
+
+ SDL_bool on
+
+} enumerated
+
+struct {
+ char * value
+
+ SDL_bool on
+
+} string
+
+
+
+
One possible value for a command line option to the SUT.
+
+
+
+
+
+
+ SDL_bool bool_value
+
+
+
+
Value if the option is of type boolean
+
+
+
+
+
+
+
+
+ struct { ... } enumerated
+
+
+
+
Index of the string in the enum_values field of the corresponding SDLVisualTest_SUTOption object. If on is true the option will passed to the SUT, otherwise it will be ignored.
+
+
+
+
+
+
+
+
+ struct { ... } integer
+
+
+
+
Value if the option is of type integer. If on is true then the option will be passed to the SUT, otherwise it will be ignored.
+
+
+
+
+
+
+
+
+ struct { ... } string
+
+
+
+
Value if the option is of type string. If on is true the option will be passed to the SUT, otherwise it will be ignored.
+
+
+
+
The documentation for this union was generated from the following file:
+
+
+
+
+
diff --git a/visualtest/docs/html/variator__common_8c.html b/visualtest/docs/html/variator__common_8c.html
new file mode 100755
index 000000000..a2db16e8e
--- /dev/null
+++ b/visualtest/docs/html/variator__common_8c.html
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/variator_common.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_test.h>
+
#include "SDL_visualtest_variator_common.h "
+
+
+
Source file for some common functionality used by variators.
+
+
+
+
+
Initializes the variation using the following rules:
+
+Boolean options are initialized to SDL_FALSE.
+Integer options are initialized to the minimum valid value they can hold.
+Enum options are initialized to the first element in the list of values they can take.
+String options are initialized to the name of the option.
+
+
Returns 1 on success, 0 on failure.
+
+
+
+
+
+
+
Converts a variation object into a string of command line arguments.
+
Parameters
+
+ variation Variation object to be converted.
+ config Config object for the SUT.
+ buffer Pointer to the buffer the arguments string will be copied into.
+ size Size of the buffer.
+
+
+
+
Returns 1 on success, 0 on failure
+
+
+
+
+
+
+
"Increments" the value of the option by one and returns the carry. We wrap around to the initial value on overflow which makes the carry one. For example: "incrementing" an SDL_FALSE option makes it SDL_TRUE with no carry, and "incrementing" an SDL_TRUE option makes it SDL_FALSE with carry one. For integers, a random value in the valid range for the option is used.
+
Parameters
+
+ var Value of the option
+ opt Object with metadata about the option
+
+
+
+
Returns 1 if there is a carry for enum and bool type options, 0 otherwise. 1 is always returned for integer and string type options. -1 is returned on error.
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/variator__exhaustive_8c.html b/visualtest/docs/html/variator__exhaustive_8c.html
new file mode 100755
index 000000000..7df560c75
--- /dev/null
+++ b/visualtest/docs/html/variator__exhaustive_8c.html
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/variator_exhaustive.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source file for the variator that tests the SUT with all the different variations of input parameters that are valid.
+
+
+
+
+
Frees any resources associated with the variator.
+
+
+
+
+
+
+
Gets the arguments string for the next variation using the variator and updates the variator's current variation object to the next variation.
+
Returns The arguments string representing the next variation on success, and NULL on failure or if we have iterated through all possible variations. In the latter case subsequent calls will start the variations again from the very beginning. The pointer returned should not be freed.
+
+
+
+
+
+
+
Initializes the variator.
+
Returns 1 on success, 0 on failure
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/variator__random_8c.html b/visualtest/docs/html/variator__random_8c.html
new file mode 100755
index 000000000..b9d776ffb
--- /dev/null
+++ b/visualtest/docs/html/variator__random_8c.html
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/variator_random.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <time.h>
+
#include <SDL_test.h>
+
#include "SDL_visualtest_random_variator.h "
+
+
+
Source file for the variator that tests the SUT with random variations to the input parameters.
+
+
+
+
+
Frees any resources associated with the variator.
+
+
+
+
+
+
+
Generates a new random variation.
+
Returns The arguments string representing the random variation on success, and NULL on failure. The pointer returned should not be freed.
+
+
+
+
+
+
+
Initializes the variator.
+
Returns 1 on success, 0 on failure
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/variators_8c.html b/visualtest/docs/html/variators_8c.html
new file mode 100755
index 000000000..d1b233cdc
--- /dev/null
+++ b/visualtest/docs/html/variators_8c.html
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/variators.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL_test.h>
+
#include "SDL_visualtest_variators.h "
+
+
+
Source file for the operations that act on variators.
+
+
+
+
+
Frees any resources associated with the variator.
+
+
+
+
+
+
+
Gets the next variation using the variator.
+
Returns The arguments string representing the variation on success, and NULL on failure. The pointer returned should not be freed.
+
+
+
+
+
+
+
Initializes the variator object pointed to by variator
of type type
with information from the config object pointed to by config
.
+
Returns 1 on success, 0 on failure
+
+
+
+
+
+
+
+
diff --git a/visualtest/docs/html/windows__process_8c.html b/visualtest/docs/html/windows__process_8c.html
new file mode 100755
index 000000000..d0cee3449
--- /dev/null
+++ b/visualtest/docs/html/windows__process_8c.html
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/windows/windows_process.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include <SDL.h>
+
#include <SDL_test.h>
+
#include <string.h>
+
#include <stdlib.h>
+
#include "SDL_visualtest_process.h "
+
+
Source file for the process API on windows.
+
+
+
+
+
diff --git a/visualtest/docs/html/windows__screenshot_8c.html b/visualtest/docs/html/windows__screenshot_8c.html
new file mode 100755
index 000000000..a42ec278b
--- /dev/null
+++ b/visualtest/docs/html/windows__screenshot_8c.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+SDL Visual Test: C:/Users/DELL/Work/sdlvisualtest/visualtest/src/windows/windows_screenshot.c File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SDL Visual Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#include "SDL_visualtest_process.h "
+
#include <SDL.h>
+
#include <SDL_test.h>
+
+
Source file for the screenshot API on windows.
+
+
+
+
+
diff --git a/visualtest/docs/latex/_s_d_l__visualtest__action__configparser_8h.tex b/visualtest/docs/latex/_s_d_l__visualtest__action__configparser_8h.tex
new file mode 100755
index 000000000..ee466d3db
--- /dev/null
+++ b/visualtest/docs/latex/_s_d_l__visualtest__action__configparser_8h.tex
@@ -0,0 +1,193 @@
+\hypertarget{_s_d_l__visualtest__action__configparser_8h}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.h File Reference}
+\label{_s_d_l__visualtest__action__configparser_8h}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___action}{S\-D\-L\-Visual\-Test\-\_\-\-Action}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___action_node}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}
+\end{DoxyCompactItemize}
+\subsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \hyperlink{_s_d_l__visualtest__action__configparser_8h_a19244c2e1556665be344807ace1556ed}{M\-A\-X\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H}~300
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef struct \hyperlink{struct_s_d_l_visual_test___action}{S\-D\-L\-Visual\-Test\-\_\-\-Action} \hyperlink{_s_d_l__visualtest__action__configparser_8h_a89974e9149bfca6aabb3ff06cc9671d7}{S\-D\-L\-Visual\-Test\-\_\-\-Action}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l_visual_test___action_node}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node} \hyperlink{_s_d_l__visualtest__action__configparser_8h_a065d1acf0f98bde777d10bd8ab24d268}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} \hyperlink{_s_d_l__visualtest__action__configparser_8h_ac9ce1bb69d8774d1818c9f9d0f97c7f1}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Type} \{ \\*
+\hyperlink{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6ac5344bca6af9c07c4ee69ee4c2b18df2}{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-A\-U\-N\-C\-H} = 0,
+\hyperlink{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6a87880c4f665344d4c3e12f9aa3af7410}{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-K\-I\-L\-L},
+\hyperlink{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6ad3d17a830b7e1e46e37d916130d8802a}{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-Q\-U\-I\-T},
+\hyperlink{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6af9b5d42cb90bf843f298be4593992fdb}{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-S\-C\-R\-E\-E\-N\-S\-H\-O\-T},
+\\*
+\hyperlink{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6a0853f8be8363015b822658b9f3b013f4}{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-V\-E\-R\-I\-F\-Y}
+ \}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{_s_d_l__visualtest__action__configparser_8h_a647d1be8f0f27af2fb1e5d4da2100596}{S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue, \hyperlink{struct_s_d_l_visual_test___action}{S\-D\-L\-Visual\-Test\-\_\-\-Action} action)
+\item
+int \hyperlink{_s_d_l__visualtest__action__configparser_8h_a0e7998533e6e10590612a8d5dee7ec0b}{S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\item
+void \hyperlink{_s_d_l__visualtest__action__configparser_8h_ae68c1c80f728e125869882139bec2c9e}{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\item
+\hyperlink{struct_s_d_l_visual_test___action}{S\-D\-L\-Visual\-Test\-\_\-\-Action} $\ast$ \hyperlink{_s_d_l__visualtest__action__configparser_8h_afb508801942e7c74084480bcdb6f8613}{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\item
+int \hyperlink{_s_d_l__visualtest__action__configparser_8h_a8484ee36f78952192d4193c85fca2f17}{S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\item
+void \hyperlink{_s_d_l__visualtest__action__configparser_8h_a677da0d0e4793df342f91974b4559efa}{S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\item
+int \hyperlink{_s_d_l__visualtest__action__configparser_8h_ace5374ef7509e95383929ff185aaf7e6}{S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue, \hyperlink{struct_s_d_l_visual_test___action}{S\-D\-L\-Visual\-Test\-\_\-\-Action} action)
+\item
+int \hyperlink{_s_d_l__visualtest__action__configparser_8h_a8ef9dce4d464d6994596deeace6ffa2d}{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config} (char $\ast$file, \hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Header file for the parser for action config files.
+
+\subsection{Macro Definition Documentation}
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a19244c2e1556665be344807ace1556ed}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!M\-A\-X\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H@{M\-A\-X\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H}}
+\index{M\-A\-X\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H@{M\-A\-X\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{M\-A\-X\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H}]{\setlength{\rightskip}{0pt plus 5cm}\#define M\-A\-X\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H~300}}\label{_s_d_l__visualtest__action__configparser_8h_a19244c2e1556665be344807ace1556ed}
+The maximum length of one line in the actions file
+
+\subsection{Typedef Documentation}
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a89974e9149bfca6aabb3ff06cc9671d7}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Action}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-Action} {\bf S\-D\-L\-Visual\-Test\-\_\-\-Action}}}\label{_s_d_l__visualtest__action__configparser_8h_a89974e9149bfca6aabb3ff06cc9671d7}
+Struct that defines an action that will be performed on the S\-U\-T process at a specific time. \hypertarget{_s_d_l__visualtest__action__configparser_8h_a065d1acf0f98bde777d10bd8ab24d268}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node} {\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}}}\label{_s_d_l__visualtest__action__configparser_8h_a065d1acf0f98bde777d10bd8ab24d268}
+Struct for a node in the action queue. \hypertarget{_s_d_l__visualtest__action__configparser_8h_ac9ce1bb69d8774d1818c9f9d0f97c7f1}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} {\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}}}\label{_s_d_l__visualtest__action__configparser_8h_ac9ce1bb69d8774d1818c9f9d0f97c7f1}
+Queue structure for actions loaded from the actions config file.
+
+\subsection{Enumeration Type Documentation}
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Action\-Type@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Type}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Type@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Type}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Type}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Type}}}\label{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6}
+Type of the action. \begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-A\-U\-N\-C\-H@{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-A\-U\-N\-C\-H}!S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-A\-U\-N\-C\-H@{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-A\-U\-N\-C\-H}}\item[{\em
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6ac5344bca6af9c07c4ee69ee4c2b18df2}{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-L\-A\-U\-N\-C\-H}\label{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6ac5344bca6af9c07c4ee69ee4c2b18df2}
+}]Launch an application with some given arguments \index{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-K\-I\-L\-L@{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-K\-I\-L\-L}!S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-K\-I\-L\-L@{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-K\-I\-L\-L}}\item[{\em
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6a87880c4f665344d4c3e12f9aa3af7410}{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-K\-I\-L\-L}\label{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6a87880c4f665344d4c3e12f9aa3af7410}
+}]Kill the S\-U\-T process \index{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-Q\-U\-I\-T@{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-Q\-U\-I\-T}!S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-Q\-U\-I\-T@{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-Q\-U\-I\-T}}\item[{\em
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6ad3d17a830b7e1e46e37d916130d8802a}{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-Q\-U\-I\-T}\label{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6ad3d17a830b7e1e46e37d916130d8802a}
+}]Quit (Gracefully exit) the S\-U\-T process \index{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-S\-C\-R\-E\-E\-N\-S\-H\-O\-T@{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-S\-C\-R\-E\-E\-N\-S\-H\-O\-T}!S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-S\-C\-R\-E\-E\-N\-S\-H\-O\-T@{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-S\-C\-R\-E\-E\-N\-S\-H\-O\-T}}\item[{\em
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6af9b5d42cb90bf843f298be4593992fdb}{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-S\-C\-R\-E\-E\-N\-S\-H\-O\-T}\label{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6af9b5d42cb90bf843f298be4593992fdb}
+}]Take a screenshot of the S\-U\-T window \index{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-V\-E\-R\-I\-F\-Y@{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-V\-E\-R\-I\-F\-Y}!S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-V\-E\-R\-I\-F\-Y@{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-V\-E\-R\-I\-F\-Y}}\item[{\em
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6a0853f8be8363015b822658b9f3b013f4}{S\-D\-L\-\_\-\-A\-C\-T\-I\-O\-N\-\_\-\-V\-E\-R\-I\-F\-Y}\label{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6a0853f8be8363015b822658b9f3b013f4}
+}]Verify a previously taken screenshot \end{description}
+\end{Desc}
+
+
+\subsection{Function Documentation}
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a0e7998533e6e10590612a8d5dee7ec0b}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__action__configparser_8h_a0e7998533e6e10590612a8d5dee7ec0b}
+Remove an action from the front of the action queue pointed to by {\ttfamily queue}.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a677da0d0e4793df342f91974b4559efa}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__action__configparser_8h_a677da0d0e4793df342f91974b4559efa}
+Dequeues all the elements in the queque pointed to by {\ttfamily queue}. \hypertarget{_s_d_l__visualtest__action__configparser_8h_a647d1be8f0f27af2fb1e5d4da2100596}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action}}]{action}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__action__configparser_8h_a647d1be8f0f27af2fb1e5d4da2100596}
+Add an action pointed to by {\ttfamily action} to the rear of the action queue pointed to by {\ttfamily queue}.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_afb508801942e7c74084480bcdb6f8613}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action}$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__action__configparser_8h_afb508801942e7c74084480bcdb6f8613}
+Get the action at the front of the action queue pointed to by {\ttfamily queue}. The returned action pointer may become invalid after subsequent dequeues.
+
+\begin{DoxyReturn}{Returns}
+pointer to the action on success, N\-U\-L\-L on failure.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_ae68c1c80f728e125869882139bec2c9e}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__action__configparser_8h_ae68c1c80f728e125869882139bec2c9e}
+Initialize the action queue pointed to by {\ttfamily queue}. \hypertarget{_s_d_l__visualtest__action__configparser_8h_ace5374ef7509e95383929ff185aaf7e6}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action}}]{action}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__action__configparser_8h_ace5374ef7509e95383929ff185aaf7e6}
+Inserts an action {\ttfamily action} into the queue pointed to by {\ttfamily queue} such that the times of actions in the queue increase as we move from the front to the rear.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a8484ee36f78952192d4193c85fca2f17}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty@{S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty@{S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__action__configparser_8h_a8484ee36f78952192d4193c85fca2f17}
+Check if the queue pointed to by {\ttfamily queue} is empty or not.
+
+\begin{DoxyReturn}{Returns}
+1 if the queue is empty, 0 otherwise.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__action__configparser_8h_a8ef9dce4d464d6994596deeace6ffa2d}{\index{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config}!SDL_visualtest_action_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{file, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__action__configparser_8h_a8ef9dce4d464d6994596deeace6ffa2d}
+Parses an action config file with path {\ttfamily file} and populates an action queue pointed to by {\ttfamily queue} with actions.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/_s_d_l__visualtest__exhaustive__variator_8h.tex b/visualtest/docs/latex/_s_d_l__visualtest__exhaustive__variator_8h.tex
new file mode 100755
index 000000000..1d4c619f4
--- /dev/null
+++ b/visualtest/docs/latex/_s_d_l__visualtest__exhaustive__variator_8h.tex
@@ -0,0 +1,69 @@
+\hypertarget{_s_d_l__visualtest__exhaustive__variator_8h}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.h File Reference}
+\label{_s_d_l__visualtest__exhaustive__variator_8h}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}}
+}
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h\char`\"{}}\\*
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___exhaustive_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l_visual_test___exhaustive_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} \hyperlink{_s_d_l__visualtest__exhaustive__variator_8h_ab64de6cf7d6a1e6d09d470c020940c25}{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{_s_d_l__visualtest__exhaustive__variator_8h_a9e213e530ddf5a18014786d10e9fdaee}{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator} (\hyperlink{struct_s_d_l_visual_test___exhaustive_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$variator, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config)
+\item
+char $\ast$ \hyperlink{_s_d_l__visualtest__exhaustive__variator_8h_aa9e13a92945ef48308215b3fa068ed29}{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation} (\hyperlink{struct_s_d_l_visual_test___exhaustive_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$variator)
+\item
+void \hyperlink{_s_d_l__visualtest__exhaustive__variator_8h_a7168b055fb86bbbb700d87ae842f7152}{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator} (\hyperlink{struct_s_d_l_visual_test___exhaustive_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$variator)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Header for the exhaustive variator.
+
+\subsection{Typedef Documentation}
+\hypertarget{_s_d_l__visualtest__exhaustive__variator_8h_ab64de6cf7d6a1e6d09d470c020940c25}{\index{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h@{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}!SDL_visualtest_exhaustive_variator.h@{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} {\bf S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}}}\label{_s_d_l__visualtest__exhaustive__variator_8h_ab64de6cf7d6a1e6d09d470c020940c25}
+Struct for the variator that exhaustively iterates through all variations of command line arguments to the S\-U\-T.
+
+\subsection{Function Documentation}
+\hypertarget{_s_d_l__visualtest__exhaustive__variator_8h_a7168b055fb86bbbb700d87ae842f7152}{\index{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h@{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator}!SDL_visualtest_exhaustive_variator.h@{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__exhaustive__variator_8h_a7168b055fb86bbbb700d87ae842f7152}
+Frees any resources associated with the variator. \hypertarget{_s_d_l__visualtest__exhaustive__variator_8h_aa9e13a92945ef48308215b3fa068ed29}{\index{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h@{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation}!SDL_visualtest_exhaustive_variator.h@{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__exhaustive__variator_8h_aa9e13a92945ef48308215b3fa068ed29}
+Gets the arguments string for the next variation using the variator and updates the variator's current variation object to the next variation.
+
+\begin{DoxyReturn}{Returns}
+The arguments string representing the next variation on success, and N\-U\-L\-L on failure or if we have iterated through all possible variations. In the latter case subsequent calls will start the variations again from the very beginning. The pointer returned should not be freed.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__exhaustive__variator_8h_a9e213e530ddf5a18014786d10e9fdaee}{\index{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h@{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator}!SDL_visualtest_exhaustive_variator.h@{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$}]{variator, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__exhaustive__variator_8h_a9e213e530ddf5a18014786d10e9fdaee}
+Initializes the variator.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/_s_d_l__visualtest__harness__argparser_8h.tex b/visualtest/docs/latex/_s_d_l__visualtest__harness__argparser_8h.tex
new file mode 100755
index 000000000..f6fea3ccb
--- /dev/null
+++ b/visualtest/docs/latex/_s_d_l__visualtest__harness__argparser_8h.tex
@@ -0,0 +1,80 @@
+\hypertarget{_s_d_l__visualtest__harness__argparser_8h}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.h File Reference}
+\label{_s_d_l__visualtest__harness__argparser_8h}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}}
+}
+{\ttfamily \#include $<$S\-D\-L.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h\char`\"{}}\\*
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___harness_state}{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}
+\end{DoxyCompactItemize}
+\subsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \hyperlink{_s_d_l__visualtest__harness__argparser_8h_abdd33f362ae3bbdacb5de76473aa8a2f}{M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N}~300
+\item
+\#define \hyperlink{_s_d_l__visualtest__harness__argparser_8h_a8485cbda108eca56406d67aaa685fcc5}{M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N}~600
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l_visual_test___harness_state}{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} \hyperlink{_s_d_l__visualtest__harness__argparser_8h_ab89725ad0ec988d4923faa6a85972455}{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{_s_d_l__visualtest__harness__argparser_8h_a629609acc04ef21a21fdfbbf6c1589c8}{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args} (char $\ast$$\ast$argv, \hyperlink{struct_s_d_l_visual_test___harness_state}{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} $\ast$state)
+\item
+void \hyperlink{_s_d_l__visualtest__harness__argparser_8h_a833147d8da541982c615645a797627cc}{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State} (\hyperlink{struct_s_d_l_visual_test___harness_state}{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} $\ast$state)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Provides functionality to parse command line arguments to the test harness.
+
+\subsection{Macro Definition Documentation}
+\hypertarget{_s_d_l__visualtest__harness__argparser_8h_abdd33f362ae3bbdacb5de76473aa8a2f}{\index{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}!M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N}}
+\index{M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N}!SDL_visualtest_harness_argparser.h@{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}}
+\subsubsection[{M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N}]{\setlength{\rightskip}{0pt plus 5cm}\#define M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N~300}}\label{_s_d_l__visualtest__harness__argparser_8h_abdd33f362ae3bbdacb5de76473aa8a2f}
+Maximum length of a path string \hypertarget{_s_d_l__visualtest__harness__argparser_8h_a8485cbda108eca56406d67aaa685fcc5}{\index{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}!M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N}}
+\index{M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N}!SDL_visualtest_harness_argparser.h@{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}}
+\subsubsection[{M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N}]{\setlength{\rightskip}{0pt plus 5cm}\#define M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N~600}}\label{_s_d_l__visualtest__harness__argparser_8h_a8485cbda108eca56406d67aaa685fcc5}
+Maximum length of a string of S\-U\-T arguments
+
+\subsection{Typedef Documentation}
+\hypertarget{_s_d_l__visualtest__harness__argparser_8h_ab89725ad0ec988d4923faa6a85972455}{\index{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!SDL_visualtest_harness_argparser.h@{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} {\bf S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}}\label{_s_d_l__visualtest__harness__argparser_8h_ab89725ad0ec988d4923faa6a85972455}
+Stores the state of the test harness.
+
+\subsection{Function Documentation}
+\hypertarget{_s_d_l__visualtest__harness__argparser_8h_a833147d8da541982c615645a797627cc}{\index{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State}!SDL_visualtest_harness_argparser.h@{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} $\ast$}]{state}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__harness__argparser_8h_a833147d8da541982c615645a797627cc}
+Frees any resources associated with the state object pointed to by {\ttfamily state}. \hypertarget{_s_d_l__visualtest__harness__argparser_8h_a629609acc04ef21a21fdfbbf6c1589c8}{\index{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args}!SDL_visualtest_harness_argparser.h@{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args (
+\begin{DoxyParamCaption}
+\item[{char $\ast$$\ast$}]{argv, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} $\ast$}]{state}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__harness__argparser_8h_a629609acc04ef21a21fdfbbf6c1589c8}
+Parse command line paramters to the test harness and populate a state object.
+
+
+\begin{DoxyParams}{Parameters}
+{\em argv} & The array of command line parameters. \\
+\hline
+{\em state} & Pointer to the state object to be populated.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Non-\/zero on success, zero on failure.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/_s_d_l__visualtest__parsehelper_8h.tex b/visualtest/docs/latex/_s_d_l__visualtest__parsehelper_8h.tex
new file mode 100755
index 000000000..f1773891d
--- /dev/null
+++ b/visualtest/docs/latex/_s_d_l__visualtest__parsehelper_8h.tex
@@ -0,0 +1,53 @@
+\hypertarget{_s_d_l__visualtest__parsehelper_8h}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-parsehelper.h File Reference}
+\label{_s_d_l__visualtest__parsehelper_8h}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h}}
+}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+char $\ast$$\ast$ \hyperlink{_s_d_l__visualtest__parsehelper_8h_a5f168fdd02f9d40ddbad97bd8c0b6361}{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv} (char $\ast$args)
+\item
+char $\ast$$\ast$ \hyperlink{_s_d_l__visualtest__parsehelper_8h_a508e690ed938e09fc3b724d2faf06899}{S\-D\-L\-Visual\-Test\-\_\-\-Tokenize} (char $\ast$str, int max\-\_\-token\-\_\-len)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Header with some helper functions for parsing strings.
+
+\subsection{Function Documentation}
+\hypertarget{_s_d_l__visualtest__parsehelper_8h_a5f168fdd02f9d40ddbad97bd8c0b6361}{\index{S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h@{S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv}!SDL_visualtest_parsehelper.h@{S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{args}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__parsehelper_8h_a5f168fdd02f9d40ddbad97bd8c0b6361}
+Takes an string of command line arguments and breaks them up into an array based on whitespace.
+
+
+\begin{DoxyParams}{Parameters}
+{\em args} & The string of arguments.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+N\-U\-L\-L on failure, an array of strings on success. The last element of the array is N\-U\-L\-L. The first element of the array is N\-U\-L\-L and should be set to the path of the executable by the caller.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__parsehelper_8h_a508e690ed938e09fc3b724d2faf06899}{\index{S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h@{S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Tokenize@{S\-D\-L\-Visual\-Test\-\_\-\-Tokenize}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Tokenize@{S\-D\-L\-Visual\-Test\-\_\-\-Tokenize}!SDL_visualtest_parsehelper.h@{S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Tokenize}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Tokenize (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{str, }
+\item[{int}]{max\-\_\-token\-\_\-len}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__parsehelper_8h_a508e690ed938e09fc3b724d2faf06899}
+Takes a string and breaks it into tokens by splitting on whitespace.
+
+
+\begin{DoxyParams}{Parameters}
+{\em str} & The string to be split. \\
+\hline
+{\em max\-\_\-token\-\_\-len} & Length of each element in the array to be returned.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+N\-U\-L\-L on failure; an array of strings with the tokens on success. The last element of the array is N\-U\-L\-L.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/_s_d_l__visualtest__process_8h.tex b/visualtest/docs/latex/_s_d_l__visualtest__process_8h.tex
new file mode 100755
index 000000000..d09cabf3c
--- /dev/null
+++ b/visualtest/docs/latex/_s_d_l__visualtest__process_8h.tex
@@ -0,0 +1,140 @@
+\hypertarget{_s_d_l__visualtest__process_8h}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-process.h File Reference}
+\label{_s_d_l__visualtest__process_8h}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-process.\-h@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-process.\-h}}
+}
+{\ttfamily \#include $<$S\-D\-L\-\_\-platform.\-h$>$}\\*
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info}
+\item
+struct \hyperlink{struct_s_d_l___process_exit_status}{S\-D\-L\-\_\-\-Process\-Exit\-Status}
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef struct \hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} \hyperlink{_s_d_l__visualtest__process_8h_a94bc9e0b0b563a527ea50ef2eecd5402}{S\-D\-L\-\_\-\-Process\-Info}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l___process_exit_status}{S\-D\-L\-\_\-\-Process\-Exit\-Status} \hyperlink{_s_d_l__visualtest__process_8h_a5b7d5262f85e78bf4d53d88f3c509342}{S\-D\-L\-\_\-\-Process\-Exit\-Status}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{_s_d_l__visualtest__process_8h_a12c16e5b870e2794d6bd5a1a3bb4582f}{S\-D\-L\-\_\-\-Launch\-Process} (char $\ast$file, char $\ast$args, \hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} $\ast$pinfo)
+\item
+int \hyperlink{_s_d_l__visualtest__process_8h_a3a131140a71bf68fa68a900f06872239}{S\-D\-L\-\_\-\-Is\-Process\-Running} (\hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} $\ast$pinfo)
+\item
+int \hyperlink{_s_d_l__visualtest__process_8h_ae66242e44a004831ab231693fd11c8d0}{S\-D\-L\-\_\-\-Kill\-Process} (\hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} $\ast$pinfo, \hyperlink{struct_s_d_l___process_exit_status}{S\-D\-L\-\_\-\-Process\-Exit\-Status} $\ast$ps)
+\item
+int \hyperlink{_s_d_l__visualtest__process_8h_ad8a5b6725ad1f0e1bac623cf4b6fc28d}{S\-D\-L\-\_\-\-Quit\-Process} (\hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} $\ast$pinfo, \hyperlink{struct_s_d_l___process_exit_status}{S\-D\-L\-\_\-\-Process\-Exit\-Status} $\ast$ps)
+\item
+int \hyperlink{_s_d_l__visualtest__process_8h_a54545d6b9f737a14030b4ce55ddd4a62}{S\-D\-L\-\_\-\-Get\-Process\-Exit\-Status} (\hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} $\ast$pinfo, \hyperlink{struct_s_d_l___process_exit_status}{S\-D\-L\-\_\-\-Process\-Exit\-Status} $\ast$ps)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Provides cross-\/platfrom process launching and termination functionality.
+
+\subsection{Typedef Documentation}
+\hypertarget{_s_d_l__visualtest__process_8h_a5b7d5262f85e78bf4d53d88f3c509342}{\index{S\-D\-L\-\_\-visualtest\-\_\-process.\-h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}!S\-D\-L\-\_\-\-Process\-Exit\-Status@{S\-D\-L\-\_\-\-Process\-Exit\-Status}}
+\index{S\-D\-L\-\_\-\-Process\-Exit\-Status@{S\-D\-L\-\_\-\-Process\-Exit\-Status}!SDL_visualtest_process.h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}}
+\subsubsection[{S\-D\-L\-\_\-\-Process\-Exit\-Status}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-\_\-\-Process\-Exit\-Status} {\bf S\-D\-L\-\_\-\-Process\-Exit\-Status}}}\label{_s_d_l__visualtest__process_8h_a5b7d5262f85e78bf4d53d88f3c509342}
+This structure stores the exit status (value returned by \hyperlink{testharness_8c_a0ddf1224851353fc92bfbff6f499fa97}{main()}) and whether the process exited sucessfully or not. \hypertarget{_s_d_l__visualtest__process_8h_a94bc9e0b0b563a527ea50ef2eecd5402}{\index{S\-D\-L\-\_\-visualtest\-\_\-process.\-h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}!S\-D\-L\-\_\-\-Process\-Info@{S\-D\-L\-\_\-\-Process\-Info}}
+\index{S\-D\-L\-\_\-\-Process\-Info@{S\-D\-L\-\_\-\-Process\-Info}!SDL_visualtest_process.h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}}
+\subsubsection[{S\-D\-L\-\_\-\-Process\-Info}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-\_\-\-Process\-Info} {\bf S\-D\-L\-\_\-\-Process\-Info}}}\label{_s_d_l__visualtest__process_8h_a94bc9e0b0b563a527ea50ef2eecd5402}
+Struct to store a platform specific handle to a process.
+
+\subsection{Function Documentation}
+\hypertarget{_s_d_l__visualtest__process_8h_a54545d6b9f737a14030b4ce55ddd4a62}{\index{S\-D\-L\-\_\-visualtest\-\_\-process.\-h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}!S\-D\-L\-\_\-\-Get\-Process\-Exit\-Status@{S\-D\-L\-\_\-\-Get\-Process\-Exit\-Status}}
+\index{S\-D\-L\-\_\-\-Get\-Process\-Exit\-Status@{S\-D\-L\-\_\-\-Get\-Process\-Exit\-Status}!SDL_visualtest_process.h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}}
+\subsubsection[{S\-D\-L\-\_\-\-Get\-Process\-Exit\-Status}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-\_\-\-Get\-Process\-Exit\-Status (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-\_\-\-Process\-Info} $\ast$}]{pinfo, }
+\item[{{\bf S\-D\-L\-\_\-\-Process\-Exit\-Status} $\ast$}]{ps}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__process_8h_a54545d6b9f737a14030b4ce55ddd4a62}
+Gets the exit status of a process. If the exit status is -\/1, the process is still running.
+
+
+\begin{DoxyParams}{Parameters}
+{\em pinfo} & Pointer to a \hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} object of the process to be checked. \\
+\hline
+{\em ps} & Pointer to a \hyperlink{struct_s_d_l___process_exit_status}{S\-D\-L\-\_\-\-Process\-Exit\-Status} object which will be populated with the exit status.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__process_8h_a3a131140a71bf68fa68a900f06872239}{\index{S\-D\-L\-\_\-visualtest\-\_\-process.\-h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}!S\-D\-L\-\_\-\-Is\-Process\-Running@{S\-D\-L\-\_\-\-Is\-Process\-Running}}
+\index{S\-D\-L\-\_\-\-Is\-Process\-Running@{S\-D\-L\-\_\-\-Is\-Process\-Running}!SDL_visualtest_process.h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}}
+\subsubsection[{S\-D\-L\-\_\-\-Is\-Process\-Running}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-\_\-\-Is\-Process\-Running (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-\_\-\-Process\-Info} $\ast$}]{pinfo}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__process_8h_a3a131140a71bf68fa68a900f06872239}
+Checks if a process is running or not.
+
+
+\begin{DoxyParams}{Parameters}
+{\em pinfo} & Pointer to \hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} object of the process that needs to be checked.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+1 if the process is still running; zero if it is not and -\/1 if the status could not be retrieved.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__process_8h_ae66242e44a004831ab231693fd11c8d0}{\index{S\-D\-L\-\_\-visualtest\-\_\-process.\-h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}!S\-D\-L\-\_\-\-Kill\-Process@{S\-D\-L\-\_\-\-Kill\-Process}}
+\index{S\-D\-L\-\_\-\-Kill\-Process@{S\-D\-L\-\_\-\-Kill\-Process}!SDL_visualtest_process.h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}}
+\subsubsection[{S\-D\-L\-\_\-\-Kill\-Process}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-\_\-\-Kill\-Process (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-\_\-\-Process\-Info} $\ast$}]{pinfo, }
+\item[{{\bf S\-D\-L\-\_\-\-Process\-Exit\-Status} $\ast$}]{ps}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__process_8h_ae66242e44a004831ab231693fd11c8d0}
+Kills a currently running process.
+
+
+\begin{DoxyParams}{Parameters}
+{\em pinfo} & Pointer to a \hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} object of the process to be terminated. \\
+\hline
+{\em ps} & Pointer to a \hyperlink{struct_s_d_l___process_exit_status}{S\-D\-L\-\_\-\-Process\-Exit\-Status} object which will be populated with the exit status.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__process_8h_a12c16e5b870e2794d6bd5a1a3bb4582f}{\index{S\-D\-L\-\_\-visualtest\-\_\-process.\-h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}!S\-D\-L\-\_\-\-Launch\-Process@{S\-D\-L\-\_\-\-Launch\-Process}}
+\index{S\-D\-L\-\_\-\-Launch\-Process@{S\-D\-L\-\_\-\-Launch\-Process}!SDL_visualtest_process.h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}}
+\subsubsection[{S\-D\-L\-\_\-\-Launch\-Process}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-\_\-\-Launch\-Process (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{file, }
+\item[{char $\ast$}]{args, }
+\item[{{\bf S\-D\-L\-\_\-\-Process\-Info} $\ast$}]{pinfo}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__process_8h_a12c16e5b870e2794d6bd5a1a3bb4582f}
+Launches a process with the given commandline arguments.
+
+
+\begin{DoxyParams}{Parameters}
+{\em file} & The path to the executable to be launched. \\
+\hline
+{\em args} & The command line arguments to be passed to the process. \\
+\hline
+{\em pinfo} & Pointer to an \hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} object to be populated with platform specific information about the launched process.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Non-\/zero on success, zero on failure.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__process_8h_ad8a5b6725ad1f0e1bac623cf4b6fc28d}{\index{S\-D\-L\-\_\-visualtest\-\_\-process.\-h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}!S\-D\-L\-\_\-\-Quit\-Process@{S\-D\-L\-\_\-\-Quit\-Process}}
+\index{S\-D\-L\-\_\-\-Quit\-Process@{S\-D\-L\-\_\-\-Quit\-Process}!SDL_visualtest_process.h@{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}}
+\subsubsection[{S\-D\-L\-\_\-\-Quit\-Process}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-\_\-\-Quit\-Process (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-\_\-\-Process\-Info} $\ast$}]{pinfo, }
+\item[{{\bf S\-D\-L\-\_\-\-Process\-Exit\-Status} $\ast$}]{ps}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__process_8h_ad8a5b6725ad1f0e1bac623cf4b6fc28d}
+Cleanly exits the process represented by {\ttfamily pinfo} and stores the exit status in the exit status object pointed to by {\ttfamily ps}.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/_s_d_l__visualtest__random__variator_8h.tex b/visualtest/docs/latex/_s_d_l__visualtest__random__variator_8h.tex
new file mode 100755
index 000000000..cbd8452ae
--- /dev/null
+++ b/visualtest/docs/latex/_s_d_l__visualtest__random__variator_8h.tex
@@ -0,0 +1,70 @@
+\hypertarget{_s_d_l__visualtest__random__variator_8h}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.h File Reference}
+\label{_s_d_l__visualtest__random__variator_8h}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}}
+}
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h\char`\"{}}\\*
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___random_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l_visual_test___random_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} \hyperlink{_s_d_l__visualtest__random__variator_8h_ab0df6ee6ec21b5070bfd8e90a7d79974}{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{_s_d_l__visualtest__random__variator_8h_a807486069b7180c3b3bf8af4616d055f}{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator} (\hyperlink{struct_s_d_l_visual_test___random_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$variator, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config, Uint64 seed)
+\item
+char $\ast$ \hyperlink{_s_d_l__visualtest__random__variator_8h_a479aceb74b5355c1d22856fc7efce890}{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation} (\hyperlink{struct_s_d_l_visual_test___random_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$variator)
+\item
+void \hyperlink{_s_d_l__visualtest__random__variator_8h_ac95d9e0716e4c918c6902b10f9591d4b}{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator} (\hyperlink{struct_s_d_l_visual_test___random_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$variator)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Header for the random variator.
+
+\subsection{Typedef Documentation}
+\hypertarget{_s_d_l__visualtest__random__variator_8h_ab0df6ee6ec21b5070bfd8e90a7d79974}{\index{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h@{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}!SDL_visualtest_random_variator.h@{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} {\bf S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}}}\label{_s_d_l__visualtest__random__variator_8h_ab0df6ee6ec21b5070bfd8e90a7d79974}
+Struct for the variator that randomly generates variations of command line arguments to the S\-U\-T.
+
+\subsection{Function Documentation}
+\hypertarget{_s_d_l__visualtest__random__variator_8h_ac95d9e0716e4c918c6902b10f9591d4b}{\index{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h@{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator}!SDL_visualtest_random_variator.h@{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__random__variator_8h_ac95d9e0716e4c918c6902b10f9591d4b}
+Frees any resources associated with the variator. \hypertarget{_s_d_l__visualtest__random__variator_8h_a479aceb74b5355c1d22856fc7efce890}{\index{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h@{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation}!SDL_visualtest_random_variator.h@{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__random__variator_8h_a479aceb74b5355c1d22856fc7efce890}
+Generates a new random variation.
+
+\begin{DoxyReturn}{Returns}
+The arguments string representing the random variation on success, and N\-U\-L\-L on failure. The pointer returned should not be freed.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__random__variator_8h_a807486069b7180c3b3bf8af4616d055f}{\index{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h@{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator}!SDL_visualtest_random_variator.h@{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$}]{variator, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config, }
+\item[{Uint64}]{seed}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__random__variator_8h_a807486069b7180c3b3bf8af4616d055f}
+Initializes the variator.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/_s_d_l__visualtest__screenshot_8h.tex b/visualtest/docs/latex/_s_d_l__visualtest__screenshot_8h.tex
new file mode 100755
index 000000000..63706fe2c
--- /dev/null
+++ b/visualtest/docs/latex/_s_d_l__visualtest__screenshot_8h.tex
@@ -0,0 +1,58 @@
+\hypertarget{_s_d_l__visualtest__screenshot_8h}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-screenshot.h File Reference}
+\label{_s_d_l__visualtest__screenshot_8h}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h}}
+}
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-process.\-h\char`\"{}}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{_s_d_l__visualtest__screenshot_8h_aefe6b7dbca1fbfb7aef081545c3ca66d}{S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Process} (\hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} $\ast$pinfo, char $\ast$prefix)
+\item
+int \hyperlink{_s_d_l__visualtest__screenshot_8h_a812c545e97db11a756145d43b3a8e5ee}{S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Desktop} (char $\ast$filename)
+\item
+int \hyperlink{_s_d_l__visualtest__screenshot_8h_ac7b5335651144961676abc2116c38299}{S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots} (char $\ast$args, char $\ast$test\-\_\-dir, char $\ast$verify\-\_\-dir)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Header for the screenshot A\-P\-I.
+
+\subsection{Function Documentation}
+\hypertarget{_s_d_l__visualtest__screenshot_8h_a812c545e97db11a756145d43b3a8e5ee}{\index{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h@{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Desktop@{S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Desktop}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Desktop@{S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Desktop}!SDL_visualtest_screenshot.h@{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Desktop}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Desktop (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{filename}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__screenshot_8h_a812c545e97db11a756145d43b3a8e5ee}
+Takes a screenshot of the desktop and saves it into the file with path {\ttfamily filename}.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__screenshot_8h_aefe6b7dbca1fbfb7aef081545c3ca66d}{\index{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h@{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Process@{S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Process}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Process@{S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Process}!SDL_visualtest_screenshot.h@{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Process}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Screenshot\-Process (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-\_\-\-Process\-Info} $\ast$}]{pinfo, }
+\item[{char $\ast$}]{prefix}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__screenshot_8h_aefe6b7dbca1fbfb7aef081545c3ca66d}
+Takes a screenshot of each window owned by the process {\ttfamily pinfo} and saves it in a file {\ttfamily prefix-\/i.\-png} where {\ttfamily prefix} is the full path to the file along with a prefix given to each screenshot.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__screenshot_8h_ac7b5335651144961676abc2116c38299}{\index{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h@{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots@{S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots@{S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots}!SDL_visualtest_screenshot.h@{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{args, }
+\item[{char $\ast$}]{test\-\_\-dir, }
+\item[{char $\ast$}]{verify\-\_\-dir}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__screenshot_8h_ac7b5335651144961676abc2116c38299}
+Compare a screenshot taken previously with S\-U\-T arguments {\ttfamily args} that is located in {\ttfamily test\-\_\-dir} with a verification image that is located in {\ttfamily verify\-\_\-dir}.
+
+\begin{DoxyReturn}{Returns}
+-\/1 on failure, 0 if the images were not equal, 1 if the images are equal and 2 if the verification image is not present.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/_s_d_l__visualtest__sut__configparser_8h.tex b/visualtest/docs/latex/_s_d_l__visualtest__sut__configparser_8h.tex
new file mode 100755
index 000000000..5cff047b5
--- /dev/null
+++ b/visualtest/docs/latex/_s_d_l__visualtest__sut__configparser_8h.tex
@@ -0,0 +1,117 @@
+\hypertarget{_s_d_l__visualtest__sut__configparser_8h}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.h File Reference}
+\label{_s_d_l__visualtest__sut__configparser_8h}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___s_u_t_int_range}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___s_u_t_option}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}
+\end{DoxyCompactItemize}
+\subsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \hyperlink{_s_d_l__visualtest__sut__configparser_8h_a0a8b0c1f8eee787abf09bf3a840eccc7}{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-N\-A\-M\-E\-\_\-\-L\-E\-N}~100
+\item
+\#define \hyperlink{_s_d_l__visualtest__sut__configparser_8h_a21a678ced8cdf55b4cc70ad398bf33b6}{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-C\-A\-T\-E\-G\-O\-R\-Y\-\_\-\-L\-E\-N}~40
+\item
+\#define \hyperlink{_s_d_l__visualtest__sut__configparser_8h_a6c700fc8ff02cfa0c795b9593f86b9a0}{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-E\-N\-U\-M\-V\-A\-L\-\_\-\-L\-E\-N}~40
+\item
+\#define \hyperlink{_s_d_l__visualtest__sut__configparser_8h_a8f1a5749af5a592b30a194c72d848f75}{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H}~256
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l_visual_test___s_u_t_int_range}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range} \hyperlink{_s_d_l__visualtest__sut__configparser_8h_a8cbe93330b2ce59cdf6da59e2eca6045}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l_visual_test___s_u_t_option}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option} \hyperlink{_s_d_l__visualtest__sut__configparser_8h_a9f35b5fe1ce4ba831a9b9e1f2bc8b7f6}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} \hyperlink{_s_d_l__visualtest__sut__configparser_8h_a1b493a40d601932b62ee643390aec169}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{_s_d_l__visualtest__sut__configparser_8h_af9893831d9f79360f57e84a67a90293c}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Type} \{ {\bfseries S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-O\-P\-T\-I\-O\-N\-T\-Y\-P\-E\-\_\-\-S\-T\-R\-I\-N\-G} = 0,
+{\bfseries S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-O\-P\-T\-I\-O\-N\-T\-Y\-P\-E\-\_\-\-I\-N\-T},
+{\bfseries S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-O\-P\-T\-I\-O\-N\-T\-Y\-P\-E\-\_\-\-E\-N\-U\-M},
+{\bfseries S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-O\-P\-T\-I\-O\-N\-T\-Y\-P\-E\-\_\-\-B\-O\-O\-L}
+ \}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{_s_d_l__visualtest__sut__configparser_8h_a8e178cd8a1f279f5d2cf908545e97544}{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config} (char $\ast$file, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config)
+\item
+void \hyperlink{_s_d_l__visualtest__sut__configparser_8h_a1bddf9732c0d3ed1c24455d22193de9a}{S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config} (\hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Header for the parser for S\-U\-T config files.
+
+\subsection{Macro Definition Documentation}
+\hypertarget{_s_d_l__visualtest__sut__configparser_8h_a21a678ced8cdf55b4cc70ad398bf33b6}{\index{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}!M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-C\-A\-T\-E\-G\-O\-R\-Y\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-C\-A\-T\-E\-G\-O\-R\-Y\-\_\-\-L\-E\-N}}
+\index{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-C\-A\-T\-E\-G\-O\-R\-Y\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-C\-A\-T\-E\-G\-O\-R\-Y\-\_\-\-L\-E\-N}!SDL_visualtest_sut_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+\subsubsection[{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-C\-A\-T\-E\-G\-O\-R\-Y\-\_\-\-L\-E\-N}]{\setlength{\rightskip}{0pt plus 5cm}\#define M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-C\-A\-T\-E\-G\-O\-R\-Y\-\_\-\-L\-E\-N~40}}\label{_s_d_l__visualtest__sut__configparser_8h_a21a678ced8cdf55b4cc70ad398bf33b6}
+Maximum length of the name of a category of an S\-U\-T option \hypertarget{_s_d_l__visualtest__sut__configparser_8h_a6c700fc8ff02cfa0c795b9593f86b9a0}{\index{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}!M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-E\-N\-U\-M\-V\-A\-L\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-E\-N\-U\-M\-V\-A\-L\-\_\-\-L\-E\-N}}
+\index{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-E\-N\-U\-M\-V\-A\-L\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-E\-N\-U\-M\-V\-A\-L\-\_\-\-L\-E\-N}!SDL_visualtest_sut_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+\subsubsection[{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-E\-N\-U\-M\-V\-A\-L\-\_\-\-L\-E\-N}]{\setlength{\rightskip}{0pt plus 5cm}\#define M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-E\-N\-U\-M\-V\-A\-L\-\_\-\-L\-E\-N~40}}\label{_s_d_l__visualtest__sut__configparser_8h_a6c700fc8ff02cfa0c795b9593f86b9a0}
+Maximum length of one enum value of an S\-U\-T option \hypertarget{_s_d_l__visualtest__sut__configparser_8h_a8f1a5749af5a592b30a194c72d848f75}{\index{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}!M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H@{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H}}
+\index{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H@{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H}!SDL_visualtest_sut_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+\subsubsection[{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H}]{\setlength{\rightskip}{0pt plus 5cm}\#define M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N\-G\-T\-H~256}}\label{_s_d_l__visualtest__sut__configparser_8h_a8f1a5749af5a592b30a194c72d848f75}
+Maximum length of a line in the paramters file \hypertarget{_s_d_l__visualtest__sut__configparser_8h_a0a8b0c1f8eee787abf09bf3a840eccc7}{\index{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}!M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-N\-A\-M\-E\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-N\-A\-M\-E\-\_\-\-L\-E\-N}}
+\index{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-N\-A\-M\-E\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-N\-A\-M\-E\-\_\-\-L\-E\-N}!SDL_visualtest_sut_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+\subsubsection[{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-N\-A\-M\-E\-\_\-\-L\-E\-N}]{\setlength{\rightskip}{0pt plus 5cm}\#define M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-N\-A\-M\-E\-\_\-\-L\-E\-N~100}}\label{_s_d_l__visualtest__sut__configparser_8h_a0a8b0c1f8eee787abf09bf3a840eccc7}
+Maximum length of the name of an S\-U\-T option
+
+\subsection{Typedef Documentation}
+\hypertarget{_s_d_l__visualtest__sut__configparser_8h_a1b493a40d601932b62ee643390aec169}{\index{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}!SDL_visualtest_sut_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} {\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}}}\label{_s_d_l__visualtest__sut__configparser_8h_a1b493a40d601932b62ee643390aec169}
+Struct to hold all the options to an S\-U\-T application. \hypertarget{_s_d_l__visualtest__sut__configparser_8h_a8cbe93330b2ce59cdf6da59e2eca6045}{\index{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}!SDL_visualtest_sut_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range} {\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}}}\label{_s_d_l__visualtest__sut__configparser_8h_a8cbe93330b2ce59cdf6da59e2eca6045}
+Represents the range of values an integer option can take. \hypertarget{_s_d_l__visualtest__sut__configparser_8h_a9f35b5fe1ce4ba831a9b9e1f2bc8b7f6}{\index{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}!SDL_visualtest_sut_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option} {\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}}}\label{_s_d_l__visualtest__sut__configparser_8h_a9f35b5fe1ce4ba831a9b9e1f2bc8b7f6}
+Struct that defines an option to be passed to the S\-U\-T.
+
+\subsection{Enumeration Type Documentation}
+\hypertarget{_s_d_l__visualtest__sut__configparser_8h_af9893831d9f79360f57e84a67a90293c}{\index{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Type@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Type}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Type@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Type}!SDL_visualtest_sut_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Type}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Type}}}\label{_s_d_l__visualtest__sut__configparser_8h_af9893831d9f79360f57e84a67a90293c}
+Describes the different kinds of options to the S\-U\-T.
+
+\subsection{Function Documentation}
+\hypertarget{_s_d_l__visualtest__sut__configparser_8h_a1bddf9732c0d3ed1c24455d22193de9a}{\index{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config}!SDL_visualtest_sut_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__sut__configparser_8h_a1bddf9732c0d3ed1c24455d22193de9a}
+Free any resources associated with the config object pointed to by {\ttfamily config}. \hypertarget{_s_d_l__visualtest__sut__configparser_8h_a8e178cd8a1f279f5d2cf908545e97544}{\index{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config}!SDL_visualtest_sut_configparser.h@{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{file, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__sut__configparser_8h_a8e178cd8a1f279f5d2cf908545e97544}
+Parses a configuration file that describes the command line options an S\-U\-T application will take and populates a S\-U\-T config object. All lines in the config file must be smaller than
+
+
+\begin{DoxyParams}{Parameters}
+{\em file} & Path to the configuration file. \\
+\hline
+{\em config} & Pointer to an object that represents an S\-U\-T configuration.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+zero on failure, non-\/zero on success
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/_s_d_l__visualtest__variator__common_8h.tex b/visualtest/docs/latex/_s_d_l__visualtest__variator__common_8h.tex
new file mode 100755
index 000000000..85527f745
--- /dev/null
+++ b/visualtest/docs/latex/_s_d_l__visualtest__variator__common_8h.tex
@@ -0,0 +1,141 @@
+\hypertarget{_s_d_l__visualtest__variator__common_8h}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.h File Reference}
+\label{_s_d_l__visualtest__variator__common_8h}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}}
+}
+{\ttfamily \#include $<$S\-D\-L\-\_\-types.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h\char`\"{}}\\*
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+union \hyperlink{union_s_d_l_visual_test___s_u_t_option_value}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___variation}{S\-D\-L\-Visual\-Test\-\_\-\-Variation}
+\end{DoxyCompactItemize}
+\subsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \hyperlink{_s_d_l__visualtest__variator__common_8h_afcdce86a10fbcdc9f3e47c47b70e3ea3}{S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-I\-N\-T\-E\-G\-E\-R\-\_\-\-O\-P\-T\-I\-O\-N\-\_\-\-T\-E\-S\-T\-\_\-\-S\-T\-E\-P\-S}~3
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef enum \\*
+\hyperlink{_s_d_l__visualtest__variator__common_8h_a04bfc880abe6940d69a63c06a33acdbd}{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type} \hyperlink{_s_d_l__visualtest__variator__common_8h_a4a7752dc89880ce3f62a478b3d0d8d64}{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}
+\item
+typedef union \\*
+\hyperlink{union_s_d_l_visual_test___s_u_t_option_value}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value} \hyperlink{_s_d_l__visualtest__variator__common_8h_aa4e5fb752f4cd087101ea3e1f6124dfb}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l_visual_test___variation}{S\-D\-L\-Visual\-Test\-\_\-\-Variation} \hyperlink{_s_d_l__visualtest__variator__common_8h_a6b447c1467862ecd623cc8f37489faeb}{S\-D\-L\-Visual\-Test\-\_\-\-Variation}
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{_s_d_l__visualtest__variator__common_8h_a04bfc880abe6940d69a63c06a33acdbd}{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type} \{ {\bfseries S\-D\-L\-\_\-\-V\-A\-R\-I\-A\-T\-O\-R\-\_\-\-N\-O\-N\-E} = 0,
+{\bfseries S\-D\-L\-\_\-\-V\-A\-R\-I\-A\-T\-O\-R\-\_\-\-E\-X\-H\-A\-U\-S\-T\-I\-V\-E},
+{\bfseries S\-D\-L\-\_\-\-V\-A\-R\-I\-A\-T\-O\-R\-\_\-\-R\-A\-N\-D\-O\-M}
+ \}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{_s_d_l__visualtest__variator__common_8h_aafcecc06c8feb24b6f6a509bfa9db681}{S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value} (\hyperlink{union_s_d_l_visual_test___s_u_t_option_value}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value} $\ast$var, \hyperlink{struct_s_d_l_visual_test___s_u_t_option}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option} $\ast$opt)
+\item
+int \hyperlink{_s_d_l__visualtest__variator__common_8h_ad981c2efab849e76dc878ef8da9d6017}{S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation} (\hyperlink{struct_s_d_l_visual_test___variation}{S\-D\-L\-Visual\-Test\-\_\-\-Variation} $\ast$variation, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config, char $\ast$buffer, int size)
+\item
+int \hyperlink{_s_d_l__visualtest__variator__common_8h_ac87934906c51364778dc910ebca47b6c}{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation} (\hyperlink{struct_s_d_l_visual_test___variation}{S\-D\-L\-Visual\-Test\-\_\-\-Variation} $\ast$variation, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Header for common functionality used by variators.
+
+\subsection{Macro Definition Documentation}
+\hypertarget{_s_d_l__visualtest__variator__common_8h_afcdce86a10fbcdc9f3e47c47b70e3ea3}{\index{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}!S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-I\-N\-T\-E\-G\-E\-R\-\_\-\-O\-P\-T\-I\-O\-N\-\_\-\-T\-E\-S\-T\-\_\-\-S\-T\-E\-P\-S@{S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-I\-N\-T\-E\-G\-E\-R\-\_\-\-O\-P\-T\-I\-O\-N\-\_\-\-T\-E\-S\-T\-\_\-\-S\-T\-E\-P\-S}}
+\index{S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-I\-N\-T\-E\-G\-E\-R\-\_\-\-O\-P\-T\-I\-O\-N\-\_\-\-T\-E\-S\-T\-\_\-\-S\-T\-E\-P\-S@{S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-I\-N\-T\-E\-G\-E\-R\-\_\-\-O\-P\-T\-I\-O\-N\-\_\-\-T\-E\-S\-T\-\_\-\-S\-T\-E\-P\-S}!SDL_visualtest_variator_common.h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}}
+\subsubsection[{S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-I\-N\-T\-E\-G\-E\-R\-\_\-\-O\-P\-T\-I\-O\-N\-\_\-\-T\-E\-S\-T\-\_\-\-S\-T\-E\-P\-S}]{\setlength{\rightskip}{0pt plus 5cm}\#define S\-D\-L\-\_\-\-S\-U\-T\-\_\-\-I\-N\-T\-E\-G\-E\-R\-\_\-\-O\-P\-T\-I\-O\-N\-\_\-\-T\-E\-S\-T\-\_\-\-S\-T\-E\-P\-S~3}}\label{_s_d_l__visualtest__variator__common_8h_afcdce86a10fbcdc9f3e47c47b70e3ea3}
+The number of variations one integer option would generate
+
+\subsection{Typedef Documentation}
+\hypertarget{_s_d_l__visualtest__variator__common_8h_aa4e5fb752f4cd087101ea3e1f6124dfb}{\index{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}!SDL_visualtest_variator_common.h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}]{\setlength{\rightskip}{0pt plus 5cm}typedef union {\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value} {\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}}}\label{_s_d_l__visualtest__variator__common_8h_aa4e5fb752f4cd087101ea3e1f6124dfb}
+One possible value for a command line option to the S\-U\-T. \hypertarget{_s_d_l__visualtest__variator__common_8h_a6b447c1467862ecd623cc8f37489faeb}{\index{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Variation}!SDL_visualtest_variator_common.h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-Variation} {\bf S\-D\-L\-Visual\-Test\-\_\-\-Variation}}}\label{_s_d_l__visualtest__variator__common_8h_a6b447c1467862ecd623cc8f37489faeb}
+Represents a valid combination of parameters that can be passed to the S\-U\-T. The ordering of the values here is the same as the ordering of the options in the \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} object for this variation. \hypertarget{_s_d_l__visualtest__variator__common_8h_a4a7752dc89880ce3f62a478b3d0d8d64}{\index{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type@{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type@{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}!SDL_visualtest_variator_common.h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}]{\setlength{\rightskip}{0pt plus 5cm}typedef enum {\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type} {\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}}}\label{_s_d_l__visualtest__variator__common_8h_a4a7752dc89880ce3f62a478b3d0d8d64}
+enum for indicating the type of variator being used
+
+\subsection{Enumeration Type Documentation}
+\hypertarget{_s_d_l__visualtest__variator__common_8h_a04bfc880abe6940d69a63c06a33acdbd}{\index{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type@{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type@{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}!SDL_visualtest_variator_common.h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}}}\label{_s_d_l__visualtest__variator__common_8h_a04bfc880abe6940d69a63c06a33acdbd}
+enum for indicating the type of variator being used
+
+\subsection{Function Documentation}
+\hypertarget{_s_d_l__visualtest__variator__common_8h_ac87934906c51364778dc910ebca47b6c}{\index{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation}!SDL_visualtest_variator_common.h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variation} $\ast$}]{variation, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__variator__common_8h_ac87934906c51364778dc910ebca47b6c}
+Initializes the variation using the following rules\-:
+\begin{DoxyItemize}
+\item Boolean options are initialized to S\-D\-L\-\_\-\-F\-A\-L\-S\-E.
+\item Integer options are initialized to the minimum valid value they can hold.
+\item Enum options are initialized to the first element in the list of values they can take.
+\item String options are initialized to the name of the option.
+\end{DoxyItemize}
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__variator__common_8h_ad981c2efab849e76dc878ef8da9d6017}{\index{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation}!SDL_visualtest_variator_common.h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variation} $\ast$}]{variation, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config, }
+\item[{char $\ast$}]{buffer, }
+\item[{int}]{size}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__variator__common_8h_ad981c2efab849e76dc878ef8da9d6017}
+Converts a variation object into a string of command line arguments.
+
+
+\begin{DoxyParams}{Parameters}
+{\em variation} & Variation object to be converted. \\
+\hline
+{\em config} & Config object for the S\-U\-T. \\
+\hline
+{\em buffer} & Pointer to the buffer the arguments string will be copied into. \\
+\hline
+{\em size} & Size of the buffer.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__variator__common_8h_aafcecc06c8feb24b6f6a509bfa9db681}{\index{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value}!SDL_visualtest_variator_common.h@{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value} $\ast$}]{var, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option} $\ast$}]{opt}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__variator__common_8h_aafcecc06c8feb24b6f6a509bfa9db681}
+\char`\"{}\-Increments\char`\"{} the value of the option by one and returns the carry. We wrap around to the initial value on overflow which makes the carry one. For example\-: \char`\"{}incrementing\char`\"{} an S\-D\-L\-\_\-\-F\-A\-L\-S\-E option makes it S\-D\-L\-\_\-\-T\-R\-U\-E with no carry, and \char`\"{}incrementing\char`\"{} an S\-D\-L\-\_\-\-T\-R\-U\-E option makes it S\-D\-L\-\_\-\-F\-A\-L\-S\-E with carry one. For integers, a random value in the valid range for the option is used.
+
+
+\begin{DoxyParams}{Parameters}
+{\em var} & Value of the option \\
+\hline
+{\em opt} & Object with metadata about the option\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+1 if there is a carry for enum and bool type options, 0 otherwise. 1 is always returned for integer and string type options. -\/1 is returned on error.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/_s_d_l__visualtest__variators_8h.tex b/visualtest/docs/latex/_s_d_l__visualtest__variators_8h.tex
new file mode 100755
index 000000000..1996113bb
--- /dev/null
+++ b/visualtest/docs/latex/_s_d_l__visualtest__variators_8h.tex
@@ -0,0 +1,71 @@
+\hypertarget{_s_d_l__visualtest__variators_8h}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-variators.h File Reference}
+\label{_s_d_l__visualtest__variators_8h}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-variators.\-h@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\-S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}}
+}
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h\char`\"{}}\\*
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___variator}{S\-D\-L\-Visual\-Test\-\_\-\-Variator}
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef struct \\*
+\hyperlink{struct_s_d_l_visual_test___variator}{S\-D\-L\-Visual\-Test\-\_\-\-Variator} \hyperlink{_s_d_l__visualtest__variators_8h_a520a2479efbe9c4a9d617735f7314e0a}{S\-D\-L\-Visual\-Test\-\_\-\-Variator}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{_s_d_l__visualtest__variators_8h_ac1d82ee387a19743e47a82c87d3fb7f4}{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator} (\hyperlink{struct_s_d_l_visual_test___variator}{S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$variator, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config, \hyperlink{_s_d_l__visualtest__variator__common_8h_a04bfc880abe6940d69a63c06a33acdbd}{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type} type, Uint64 seed)
+\item
+char $\ast$ \hyperlink{_s_d_l__visualtest__variators_8h_aebdd4c3c545b0063d16929fd56f1a79f}{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation} (\hyperlink{struct_s_d_l_visual_test___variator}{S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$variator)
+\item
+void \hyperlink{_s_d_l__visualtest__variators_8h_a98727ef649135c3312056d7603cb70b5}{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator} (\hyperlink{struct_s_d_l_visual_test___variator}{S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$variator)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Header for all the variators that vary input parameters to a S\-U\-T application.
+
+\subsection{Typedef Documentation}
+\hypertarget{_s_d_l__visualtest__variators_8h_a520a2479efbe9c4a9d617735f7314e0a}{\index{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Variator}!SDL_visualtest_variators.h@{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator} {\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator}}}\label{_s_d_l__visualtest__variators_8h_a520a2479efbe9c4a9d617735f7314e0a}
+Struct that acts like a wrapper around the different types of variators available.
+
+\subsection{Function Documentation}
+\hypertarget{_s_d_l__visualtest__variators_8h_a98727ef649135c3312056d7603cb70b5}{\index{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator}!SDL_visualtest_variators.h@{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__variators_8h_a98727ef649135c3312056d7603cb70b5}
+Frees any resources associated with the variator. \hypertarget{_s_d_l__visualtest__variators_8h_aebdd4c3c545b0063d16929fd56f1a79f}{\index{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation}!SDL_visualtest_variators.h@{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__variators_8h_aebdd4c3c545b0063d16929fd56f1a79f}
+Gets the next variation using the variator.
+
+\begin{DoxyReturn}{Returns}
+The arguments string representing the variation on success, and N\-U\-L\-L on failure. The pointer returned should not be freed.
+\end{DoxyReturn}
+\hypertarget{_s_d_l__visualtest__variators_8h_ac1d82ee387a19743e47a82c87d3fb7f4}{\index{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h@{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}!S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator}!SDL_visualtest_variators.h@{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$}]{variator, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}}]{type, }
+\item[{Uint64}]{seed}
+\end{DoxyParamCaption}
+)}}\label{_s_d_l__visualtest__variators_8h_ac1d82ee387a19743e47a82c87d3fb7f4}
+Initializes the variator object pointed to by {\ttfamily variator} of type {\ttfamily type} with information from the config object pointed to by {\ttfamily config}.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/action__configparser_8c.tex b/visualtest/docs/latex/action__configparser_8c.tex
new file mode 100755
index 000000000..a25e86b30
--- /dev/null
+++ b/visualtest/docs/latex/action__configparser_8c.tex
@@ -0,0 +1,123 @@
+\hypertarget{action__configparser_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/action\-\_\-configparser.c File Reference}
+\label{action__configparser_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/action\-\_\-configparser.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/action\-\_\-configparser.\-c}}
+}
+{\ttfamily \#include $<$S\-D\-L\-\_\-stdinc.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include $<$string.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-rwhelper.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h\char`\"{}}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{action__configparser_8c_a647d1be8f0f27af2fb1e5d4da2100596}{S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue, \hyperlink{struct_s_d_l_visual_test___action}{S\-D\-L\-Visual\-Test\-\_\-\-Action} action)
+\item
+int \hyperlink{action__configparser_8c_a0e7998533e6e10590612a8d5dee7ec0b}{S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\item
+void \hyperlink{action__configparser_8c_ae68c1c80f728e125869882139bec2c9e}{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\item
+\hyperlink{struct_s_d_l_visual_test___action}{S\-D\-L\-Visual\-Test\-\_\-\-Action} $\ast$ \hyperlink{action__configparser_8c_afb508801942e7c74084480bcdb6f8613}{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\item
+int \hyperlink{action__configparser_8c_a8484ee36f78952192d4193c85fca2f17}{S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\item
+void \hyperlink{action__configparser_8c_a677da0d0e4793df342f91974b4559efa}{S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\item
+int \hyperlink{action__configparser_8c_ace5374ef7509e95383929ff185aaf7e6}{S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue} (\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue, \hyperlink{struct_s_d_l_visual_test___action}{S\-D\-L\-Visual\-Test\-\_\-\-Action} action)
+\item
+int \hyperlink{action__configparser_8c_a8ef9dce4d464d6994596deeace6ffa2d}{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config} (char $\ast$file, \hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$queue)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Source file for the parser for action config files.
+
+\subsection{Function Documentation}
+\hypertarget{action__configparser_8c_a0e7998533e6e10590612a8d5dee7ec0b}{\index{action\-\_\-configparser.\-c@{action\-\_\-configparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action}!action_configparser.c@{action\-\_\-configparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Dequeue\-Action (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{action__configparser_8c_a0e7998533e6e10590612a8d5dee7ec0b}
+Remove an action from the front of the action queue pointed to by {\ttfamily queue}.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{action__configparser_8c_a677da0d0e4793df342f91974b4559efa}{\index{action\-\_\-configparser.\-c@{action\-\_\-configparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue}!action_configparser.c@{action\-\_\-configparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Empty\-Action\-Queue (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{action__configparser_8c_a677da0d0e4793df342f91974b4559efa}
+Dequeues all the elements in the queque pointed to by {\ttfamily queue}. \hypertarget{action__configparser_8c_a647d1be8f0f27af2fb1e5d4da2100596}{\index{action\-\_\-configparser.\-c@{action\-\_\-configparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action}!action_configparser.c@{action\-\_\-configparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Enqueue\-Action (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action}}]{action}
+\end{DoxyParamCaption}
+)}}\label{action__configparser_8c_a647d1be8f0f27af2fb1e5d4da2100596}
+Add an action pointed to by {\ttfamily action} to the rear of the action queue pointed to by {\ttfamily queue}.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{action__configparser_8c_afb508801942e7c74084480bcdb6f8613}{\index{action\-\_\-configparser.\-c@{action\-\_\-configparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front}!action_configparser.c@{action\-\_\-configparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action}$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Get\-Queue\-Front (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{action__configparser_8c_afb508801942e7c74084480bcdb6f8613}
+Get the action at the front of the action queue pointed to by {\ttfamily queue}. The returned action pointer may become invalid after subsequent dequeues.
+
+\begin{DoxyReturn}{Returns}
+pointer to the action on success, N\-U\-L\-L on failure.
+\end{DoxyReturn}
+\hypertarget{action__configparser_8c_ae68c1c80f728e125869882139bec2c9e}{\index{action\-\_\-configparser.\-c@{action\-\_\-configparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue}!action_configparser.c@{action\-\_\-configparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Init\-Action\-Queue (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{action__configparser_8c_ae68c1c80f728e125869882139bec2c9e}
+Initialize the action queue pointed to by {\ttfamily queue}. \hypertarget{action__configparser_8c_ace5374ef7509e95383929ff185aaf7e6}{\index{action\-\_\-configparser.\-c@{action\-\_\-configparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue}!action_configparser.c@{action\-\_\-configparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Insert\-Into\-Action\-Queue (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action}}]{action}
+\end{DoxyParamCaption}
+)}}\label{action__configparser_8c_ace5374ef7509e95383929ff185aaf7e6}
+Inserts an action {\ttfamily action} into the queue pointed to by {\ttfamily queue} such that the times of actions in the queue increase as we move from the front to the rear.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{action__configparser_8c_a8484ee36f78952192d4193c85fca2f17}{\index{action\-\_\-configparser.\-c@{action\-\_\-configparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty@{S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty@{S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty}!action_configparser.c@{action\-\_\-configparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Is\-Action\-Queue\-Empty (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{action__configparser_8c_a8484ee36f78952192d4193c85fca2f17}
+Check if the queue pointed to by {\ttfamily queue} is empty or not.
+
+\begin{DoxyReturn}{Returns}
+1 if the queue is empty, 0 otherwise.
+\end{DoxyReturn}
+\hypertarget{action__configparser_8c_a8ef9dce4d464d6994596deeace6ffa2d}{\index{action\-\_\-configparser.\-c@{action\-\_\-configparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config}!action_configparser.c@{action\-\_\-configparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Action\-Config (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{file, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} $\ast$}]{queue}
+\end{DoxyParamCaption}
+)}}\label{action__configparser_8c_a8ef9dce4d464d6994596deeace6ffa2d}
+Parses an action config file with path {\ttfamily file} and populates an action queue pointed to by {\ttfamily queue} with actions.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/annotated.tex b/visualtest/docs/latex/annotated.tex
new file mode 100755
index 000000000..9b865bd89
--- /dev/null
+++ b/visualtest/docs/latex/annotated.tex
@@ -0,0 +1,18 @@
+\section{Data Structures}
+Here are the data structures with brief descriptions\-:\begin{DoxyCompactList}
+\item\contentsline{section}{\hyperlink{struct_s_d_l___process_exit_status}{S\-D\-L\-\_\-\-Process\-Exit\-Status} }{\pageref{struct_s_d_l___process_exit_status}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l___process_info}{S\-D\-L\-\_\-\-Process\-Info} }{\pageref{struct_s_d_l___process_info}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___action}{S\-D\-L\-Visual\-Test\-\_\-\-Action} }{\pageref{struct_s_d_l_visual_test___action}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___action_node}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node} }{\pageref{struct_s_d_l_visual_test___action_node}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} }{\pageref{struct_s_d_l_visual_test___action_queue}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___exhaustive_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} }{\pageref{struct_s_d_l_visual_test___exhaustive_variator}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___harness_state}{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} }{\pageref{struct_s_d_l_visual_test___harness_state}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___random_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} }{\pageref{struct_s_d_l_visual_test___random_variator}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___r_w_helper_buffer}{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer} }{\pageref{struct_s_d_l_visual_test___r_w_helper_buffer}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} }{\pageref{struct_s_d_l_visual_test___s_u_t_config}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___s_u_t_int_range}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range} }{\pageref{struct_s_d_l_visual_test___s_u_t_int_range}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___s_u_t_option}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option} }{\pageref{struct_s_d_l_visual_test___s_u_t_option}}{}
+\item\contentsline{section}{\hyperlink{union_s_d_l_visual_test___s_u_t_option_value}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value} }{\pageref{union_s_d_l_visual_test___s_u_t_option_value}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___variation}{S\-D\-L\-Visual\-Test\-\_\-\-Variation} }{\pageref{struct_s_d_l_visual_test___variation}}{}
+\item\contentsline{section}{\hyperlink{struct_s_d_l_visual_test___variator}{S\-D\-L\-Visual\-Test\-\_\-\-Variator} }{\pageref{struct_s_d_l_visual_test___variator}}{}
+\end{DoxyCompactList}
diff --git a/visualtest/docs/latex/dir_244674c763b96fdad0a6ffe8d0250e08.tex b/visualtest/docs/latex/dir_244674c763b96fdad0a6ffe8d0250e08.tex
new file mode 100755
index 000000000..6ae929c04
--- /dev/null
+++ b/visualtest/docs/latex/dir_244674c763b96fdad0a6ffe8d0250e08.tex
@@ -0,0 +1,8 @@
+\hypertarget{dir_244674c763b96fdad0a6ffe8d0250e08}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/unittest Directory Reference}
+\label{dir_244674c763b96fdad0a6ffe8d0250e08}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/unittest Directory Reference@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/unittest Directory Reference}}
+}
+\subsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file {\bfseries testquit.\-c}
+\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/dir_68267d1309a1af8e8297ef4c3efbcdba.tex b/visualtest/docs/latex/dir_68267d1309a1af8e8297ef4c3efbcdba.tex
new file mode 100755
index 000000000..636633334
--- /dev/null
+++ b/visualtest/docs/latex/dir_68267d1309a1af8e8297ef4c3efbcdba.tex
@@ -0,0 +1,37 @@
+\hypertarget{dir_68267d1309a1af8e8297ef4c3efbcdba}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src Directory Reference}
+\label{dir_68267d1309a1af8e8297ef4c3efbcdba}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src Directory Reference@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src Directory Reference}}
+}
+\subsection*{Directories}
+\begin{DoxyCompactItemize}
+\item
+directory \hyperlink{dir_a18918b93668b435612395bbc2e8b82b}{linux}
+\item
+directory \hyperlink{dir_f584182df4c69fab0b14563b4d535158}{windows}
+\end{DoxyCompactItemize}
+\subsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \hyperlink{action__configparser_8c}{action\-\_\-configparser.\-c}
+\item
+file \hyperlink{harness__argparser_8c}{harness\-\_\-argparser.\-c}
+\item
+file \hyperlink{mischelper_8c}{mischelper.\-c}
+\item
+file \hyperlink{parsehelper_8c}{parsehelper.\-c}
+\item
+file \hyperlink{rwhelper_8c}{rwhelper.\-c}
+\item
+file \hyperlink{screenshot_8c}{screenshot.\-c}
+\item
+file \hyperlink{sut__configparser_8c}{sut\-\_\-configparser.\-c}
+\item
+file \hyperlink{testharness_8c}{testharness.\-c}
+\item
+file \hyperlink{variator__common_8c}{variator\-\_\-common.\-c}
+\item
+file \hyperlink{variator__exhaustive_8c}{variator\-\_\-exhaustive.\-c}
+\item
+file \hyperlink{variator__random_8c}{variator\-\_\-random.\-c}
+\item
+file \hyperlink{variators_8c}{variators.\-c}
+\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/dir_88e6415a3128b404f1102a130772bdb6.tex b/visualtest/docs/latex/dir_88e6415a3128b404f1102a130772bdb6.tex
new file mode 100755
index 000000000..da3c158e2
--- /dev/null
+++ b/visualtest/docs/latex/dir_88e6415a3128b404f1102a130772bdb6.tex
@@ -0,0 +1,8 @@
+\hypertarget{dir_88e6415a3128b404f1102a130772bdb6}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/linux Directory Reference}
+\label{dir_88e6415a3128b404f1102a130772bdb6}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/linux Directory Reference@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/linux Directory Reference}}
+}
+\subsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file {\bfseries linux\-\_\-process.\-c}
+\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/dir_a18918b93668b435612395bbc2e8b82b.tex b/visualtest/docs/latex/dir_a18918b93668b435612395bbc2e8b82b.tex
new file mode 100755
index 000000000..863c6e4f9
--- /dev/null
+++ b/visualtest/docs/latex/dir_a18918b93668b435612395bbc2e8b82b.tex
@@ -0,0 +1,8 @@
+\hypertarget{dir_a18918b93668b435612395bbc2e8b82b}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/linux Directory Reference}
+\label{dir_a18918b93668b435612395bbc2e8b82b}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/linux Directory Reference@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/linux Directory Reference}}
+}
+\subsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \hyperlink{linux__process_8c}{linux\-\_\-process.\-c}
+\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/dir_d44c64559bbebec7f509842c48db8b23.tex b/visualtest/docs/latex/dir_d44c64559bbebec7f509842c48db8b23.tex
new file mode 100755
index 000000000..07211c070
--- /dev/null
+++ b/visualtest/docs/latex/dir_d44c64559bbebec7f509842c48db8b23.tex
@@ -0,0 +1,30 @@
+\hypertarget{dir_d44c64559bbebec7f509842c48db8b23}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include Directory Reference}
+\label{dir_d44c64559bbebec7f509842c48db8b23}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include Directory Reference@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include Directory Reference}}
+}
+\subsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \hyperlink{_s_d_l__visualtest__action__configparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}
+\item
+file \hyperlink{_s_d_l__visualtest__exhaustive__variator_8h}{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}
+\item
+file \hyperlink{_s_d_l__visualtest__harness__argparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}
+\item
+file {\bfseries S\-D\-L\-\_\-visualtest\-\_\-mischelper.\-h}
+\item
+file \hyperlink{_s_d_l__visualtest__parsehelper_8h}{S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h}
+\item
+file \hyperlink{_s_d_l__visualtest__process_8h}{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}
+\item
+file \hyperlink{_s_d_l__visualtest__random__variator_8h}{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}
+\item
+file {\bfseries S\-D\-L\-\_\-visualtest\-\_\-rwhelper.\-h}
+\item
+file \hyperlink{_s_d_l__visualtest__screenshot_8h}{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h}
+\item
+file \hyperlink{_s_d_l__visualtest__sut__configparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}
+\item
+file \hyperlink{_s_d_l__visualtest__variator__common_8h}{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}
+\item
+file \hyperlink{_s_d_l__visualtest__variators_8h}{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}
+\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/dir_f584182df4c69fab0b14563b4d535158.tex b/visualtest/docs/latex/dir_f584182df4c69fab0b14563b4d535158.tex
new file mode 100755
index 000000000..390006c70
--- /dev/null
+++ b/visualtest/docs/latex/dir_f584182df4c69fab0b14563b4d535158.tex
@@ -0,0 +1,10 @@
+\hypertarget{dir_f584182df4c69fab0b14563b4d535158}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows Directory Reference}
+\label{dir_f584182df4c69fab0b14563b4d535158}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows Directory Reference@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows Directory Reference}}
+}
+\subsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \hyperlink{windows__process_8c}{windows\-\_\-process.\-c}
+\item
+file \hyperlink{windows__screenshot_8c}{windows\-\_\-screenshot.\-c}
+\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/dir_fe549de2418b81853b5f194edb4a7f34.tex b/visualtest/docs/latex/dir_fe549de2418b81853b5f194edb4a7f34.tex
new file mode 100755
index 000000000..98e2c4302
--- /dev/null
+++ b/visualtest/docs/latex/dir_fe549de2418b81853b5f194edb4a7f34.tex
@@ -0,0 +1,8 @@
+\hypertarget{dir_fe549de2418b81853b5f194edb4a7f34}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/windows Directory Reference}
+\label{dir_fe549de2418b81853b5f194edb4a7f34}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/windows Directory Reference@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/windows Directory Reference}}
+}
+\subsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \hyperlink{windows__process_8c}{windows\-\_\-process.\-c}
+\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/doxygen.sty b/visualtest/docs/latex/doxygen.sty
new file mode 100755
index 000000000..199abf8d5
--- /dev/null
+++ b/visualtest/docs/latex/doxygen.sty
@@ -0,0 +1,464 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+
+% Packages used by this style file
+\RequirePackage{alltt}
+\RequirePackage{array}
+\RequirePackage{calc}
+\RequirePackage{float}
+\RequirePackage{ifthen}
+\RequirePackage{verbatim}
+\RequirePackage[table]{xcolor}
+\RequirePackage{xtab}
+
+%---------- Internal commands used in this style file ----------------
+
+\newcommand{\ensurespace}[1]{%
+ \begingroup%
+ \setlength{\dimen@}{#1}%
+ \vskip\z@\@plus\dimen@%
+ \penalty -100\vskip\z@\@plus -\dimen@%
+ \vskip\dimen@%
+ \penalty 9999%
+ \vskip -\dimen@%
+ \vskip\z@skip% hide the previous |\vskip| from |\addvspace|
+ \endgroup%
+}
+
+\newcommand{\DoxyLabelFont}{}
+\newcommand{\entrylabel}[1]{%
+ {%
+ \parbox[b]{\labelwidth-4pt}{%
+ \makebox[0pt][l]{\DoxyLabelFont#1}%
+ \vspace{1.5\baselineskip}%
+ }%
+ }%
+}
+
+\newenvironment{DoxyDesc}[1]{%
+ \ensurespace{4\baselineskip}%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+\newsavebox{\xrefbox}
+\newlength{\xreflength}
+\newcommand{\xreflabel}[1]{%
+ \sbox{\xrefbox}{#1}%
+ \setlength{\xreflength}{\wd\xrefbox}%
+ \ifthenelse{\xreflength>\labelwidth}{%
+ \begin{minipage}{\textwidth}%
+ \setlength{\parindent}{0pt}%
+ \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}%
+ \end{minipage}%
+ }{%
+ \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}%
+ }%
+}
+
+%---------- Commands used by doxygen LaTeX output generator ----------
+
+% Used by ...
+\newenvironment{DoxyPre}{%
+ \small%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+
+% Used by @code ... @endcode
+\newenvironment{DoxyCode}{%
+ \par%
+ \scriptsize%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+
+% Used by @example, @include, @includelineno and @dontinclude
+\newenvironment{DoxyCodeInclude}{%
+ \DoxyCode%
+}{%
+ \endDoxyCode%
+}
+
+% Used by @verbatim ... @endverbatim
+\newenvironment{DoxyVerb}{%
+ \footnotesize%
+ \verbatim%
+}{%
+ \endverbatim%
+ \normalsize%
+}
+
+% Used by @verbinclude
+\newenvironment{DoxyVerbInclude}{%
+ \DoxyVerb%
+}{%
+ \endDoxyVerb%
+}
+
+% Used by numbered lists (using '-#' or ... )
+\newenvironment{DoxyEnumerate}{%
+ \enumerate%
+}{%
+ \endenumerate%
+}
+
+% Used by bullet lists (using '-', @li, @arg, or )
+\newenvironment{DoxyItemize}{%
+ \itemize%
+}{%
+ \enditemize%
+}
+
+% Used by description lists (using ... )
+\newenvironment{DoxyDescription}{%
+ \description%
+}{%
+ \enddescription%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if caption is specified)
+\newenvironment{DoxyImage}{%
+ \begin{figure}[H]%
+ \begin{center}%
+}{%
+ \end{center}%
+ \end{figure}%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if no caption is specified)
+\newenvironment{DoxyImageNoCaption}{%
+}{%
+}
+
+% Used by @attention
+\newenvironment{DoxyAttention}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @author and @authors
+\newenvironment{DoxyAuthor}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @date
+\newenvironment{DoxyDate}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @invariant
+\newenvironment{DoxyInvariant}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @note
+\newenvironment{DoxyNote}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @post
+\newenvironment{DoxyPostcond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @pre
+\newenvironment{DoxyPrecond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @copyright
+\newenvironment{DoxyCopyright}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @remark
+\newenvironment{DoxyRemark}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @return and @returns
+\newenvironment{DoxyReturn}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @since
+\newenvironment{DoxySince}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @see
+\newenvironment{DoxySeeAlso}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @version
+\newenvironment{DoxyVersion}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @warning
+\newenvironment{DoxyWarning}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @internal
+\newenvironment{DoxyInternal}[1]{%
+ \paragraph*{#1}%
+}{%
+}
+
+% Used by @par and @paragraph
+\newenvironment{DoxyParagraph}[1]{%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{40pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{-4pt}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists
+\newenvironment{DoxyParams}[2][]{%
+ \par%
+ \tabletail{\hline}%
+ \tablelasttail{\hline}%
+ \tablefirsthead{}%
+ \tablehead{}%
+ \ifthenelse{\equal{#1}{}}%
+ {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
+ \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+ p{0.805\textwidth}|}}%
+ {\ifthenelse{\equal{#1}{1}}%
+ {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
+ \begin{xtabular}{|>{\centering}p{0.10\textwidth}|%
+ >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+ p{0.678\textwidth}|}}%
+ {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
+ \begin{xtabular}{|>{\centering}p{0.10\textwidth}|%
+ >{\centering\hspace{0pt}}p{0.15\textwidth}|%
+ >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+ p{0.501\textwidth}|}}%
+ }\hline%
+}{%
+ \end{xtabular}%
+ \tablefirsthead{}%
+ \vspace{6pt}%
+}
+
+% Used for fields of simple structs
+\newenvironment{DoxyFields}[1]{%
+ \par%
+ \tabletail{\hline}%
+ \tablelasttail{\hline}%
+ \tablehead{}%
+ \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+ \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+ p{0.15\textwidth}|%
+ p{0.63\textwidth}|}%
+ \hline%
+}{%
+ \end{xtabular}%
+ \tablefirsthead{}%
+ \vspace{6pt}%
+}
+
+% Used for parameters within a detailed function description
+\newenvironment{DoxyParamCaption}{%
+ \renewcommand{\item}[2][]{##1 {\em ##2}}%
+}{%
+}
+
+% Used by return value lists
+\newenvironment{DoxyRetVals}[1]{%
+ \par%
+ \tabletail{\hline}%
+ \tablelasttail{\hline}%
+ \tablehead{}%
+ \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+ \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
+ p{0.705\textwidth}|}%
+ \hline%
+}{%
+ \end{xtabular}%
+ \tablefirsthead{}%
+ \vspace{6pt}%
+}
+
+% Used by exception lists
+\newenvironment{DoxyExceptions}[1]{%
+ \par%
+ \tabletail{\hline}%
+ \tablelasttail{\hline}%
+ \tablehead{}%
+ \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+ \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
+ p{0.705\textwidth}|}%
+ \hline%
+}{%
+ \end{xtabular}%
+ \tablefirsthead{}%
+ \vspace{6pt}%
+}
+
+% Used by template parameter lists
+\newenvironment{DoxyTemplParams}[1]{%
+ \par%
+ \tabletail{\hline}%
+ \tablelasttail{\hline}%
+ \tablehead{}%
+ \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+ \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
+ p{0.705\textwidth}|}%
+ \hline%
+}{%
+ \end{xtabular}%
+ \tablefirsthead{}%
+ \vspace{6pt}%
+}
+
+% Used for member lists
+\newenvironment{DoxyCompactItemize}{%
+ \begin{itemize}%
+ \setlength{\itemsep}{-3pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \setlength{\partopsep}{0pt}%
+}{%
+ \end{itemize}%
+}
+
+% Used for member descriptions
+\newenvironment{DoxyCompactList}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \renewcommand{\makelabel}{\hfill}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used for reference lists (@bug, @deprecated, @todo, etc.)
+\newenvironment{DoxyRefList}{%
+ \begin{list}{}{%
+ \setlength{\labelwidth}{10pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \addtolength{\leftmargin}{\labelsep}%
+ \renewcommand{\makelabel}{\xreflabel}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by @bug, @deprecated, @todo, etc.
+\newenvironment{DoxyRefDesc}[1]{%
+ \begin{list}{}{%
+ \renewcommand\makelabel[1]{\textbf{##1}}%
+ \settowidth\labelwidth{\makelabel{#1}}%
+ \setlength\leftmargin{\labelwidth+\labelsep}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists and simple sections
+\newenvironment{Desc}
+{\begin{list}{}{%
+ \settowidth{\labelwidth}{40pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{-4pt}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }
+}{%
+ \end{list}%
+}
+
+% Used by tables
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
+\newlength{\tmplength}%
+\newenvironment{TabularC}[1]%
+{%
+\setlength{\tmplength}%
+ {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}%
+ \par\begin{xtabular*}{\linewidth}%
+ {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}%
+}%
+{\end{xtabular*}\par}%
+
+% Used for member group headers
+\newenvironment{Indent}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ }%
+ \item[]\ignorespaces%
+}{%
+ \unskip%
+ \end{list}%
+}
+
+% Used when hyperlinks are turned off
+\newcommand{\doxyref}[3]{%
+ \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
+}
+
+% Used for syntax highlighting
+\definecolor{comment}{rgb}{0.5,0.0,0.0}
+\definecolor{keyword}{rgb}{0.0,0.5,0.0}
+\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
+\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}
+\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}
+\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}
+\definecolor{charliteral}{rgb}{0.0,0.5,0.5}
+\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}
+\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
+\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
+\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
diff --git a/visualtest/docs/latex/files.tex b/visualtest/docs/latex/files.tex
new file mode 100755
index 000000000..ef70e9b54
--- /dev/null
+++ b/visualtest/docs/latex/files.tex
@@ -0,0 +1,31 @@
+\section{File List}
+Here is a list of all documented files with brief descriptions\-:\begin{DoxyCompactList}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/{\bfseries config.\-h} }{\pageref{config_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__action__configparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h} }{\pageref{_s_d_l__visualtest__action__configparser_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__exhaustive__variator_8h}{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h} }{\pageref{_s_d_l__visualtest__exhaustive__variator_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__harness__argparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h} }{\pageref{_s_d_l__visualtest__harness__argparser_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/{\bfseries S\-D\-L\-\_\-visualtest\-\_\-mischelper.\-h} }{\pageref{_s_d_l__visualtest__mischelper_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__parsehelper_8h}{S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h} }{\pageref{_s_d_l__visualtest__parsehelper_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__process_8h}{S\-D\-L\-\_\-visualtest\-\_\-process.\-h} }{\pageref{_s_d_l__visualtest__process_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__random__variator_8h}{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h} }{\pageref{_s_d_l__visualtest__random__variator_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/{\bfseries S\-D\-L\-\_\-visualtest\-\_\-rwhelper.\-h} }{\pageref{_s_d_l__visualtest__rwhelper_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__screenshot_8h}{S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h} }{\pageref{_s_d_l__visualtest__screenshot_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__sut__configparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h} }{\pageref{_s_d_l__visualtest__sut__configparser_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__variator__common_8h}{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h} }{\pageref{_s_d_l__visualtest__variator__common_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__variators_8h}{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h} }{\pageref{_s_d_l__visualtest__variators_8h}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{action__configparser_8c}{action\-\_\-configparser.\-c} }{\pageref{action__configparser_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{harness__argparser_8c}{harness\-\_\-argparser.\-c} }{\pageref{harness__argparser_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{mischelper_8c}{mischelper.\-c} }{\pageref{mischelper_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{parsehelper_8c}{parsehelper.\-c} }{\pageref{parsehelper_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{rwhelper_8c}{rwhelper.\-c} }{\pageref{rwhelper_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{screenshot_8c}{screenshot.\-c} }{\pageref{screenshot_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{sut__configparser_8c}{sut\-\_\-configparser.\-c} }{\pageref{sut__configparser_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{testharness_8c}{testharness.\-c} }{\pageref{testharness_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{variator__common_8c}{variator\-\_\-common.\-c} }{\pageref{variator__common_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{variator__exhaustive_8c}{variator\-\_\-exhaustive.\-c} }{\pageref{variator__exhaustive_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{variator__random_8c}{variator\-\_\-random.\-c} }{\pageref{variator__random_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/\hyperlink{variators_8c}{variators.\-c} }{\pageref{variators_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/linux/\hyperlink{linux__process_8c}{linux\-\_\-process.\-c} }{\pageref{linux__process_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows/\hyperlink{windows__process_8c}{windows\-\_\-process.\-c} }{\pageref{windows__process_8c}}{}
+\item\contentsline{section}{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows/\hyperlink{windows__screenshot_8c}{windows\-\_\-screenshot.\-c} }{\pageref{windows__screenshot_8c}}{}
+\end{DoxyCompactList}
diff --git a/visualtest/docs/latex/harness__argparser_8c.tex b/visualtest/docs/latex/harness__argparser_8c.tex
new file mode 100755
index 000000000..bf025f8ff
--- /dev/null
+++ b/visualtest/docs/latex/harness__argparser_8c.tex
@@ -0,0 +1,64 @@
+\hypertarget{harness__argparser_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/harness\-\_\-argparser.c File Reference}
+\label{harness__argparser_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/harness\-\_\-argparser.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/harness\-\_\-argparser.\-c}}
+}
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include $<$stdio.\-h$>$}\\*
+{\ttfamily \#include $<$string.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-rwhelper.\-h\char`\"{}}\\*
+\subsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \hyperlink{harness__argparser_8c_a7186273cd88640b740b6333cd98ae243}{M\-A\-X\-\_\-\-C\-O\-N\-F\-I\-G\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N}~400
+\item
+\#define \hyperlink{harness__argparser_8c_a6669f8e5a07e7a0e4622dd23362831e7}{D\-E\-F\-A\-U\-L\-T\-\_\-\-S\-U\-T\-\_\-\-T\-I\-M\-E\-O\-U\-T}~(60 $\ast$ 1000)
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{harness__argparser_8c_a629609acc04ef21a21fdfbbf6c1589c8}{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args} (char $\ast$$\ast$argv, \hyperlink{struct_s_d_l_visual_test___harness_state}{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} $\ast$state)
+\item
+void \hyperlink{harness__argparser_8c_a833147d8da541982c615645a797627cc}{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State} (\hyperlink{struct_s_d_l_visual_test___harness_state}{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} $\ast$state)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Source file for functions to parse arguments to the test harness.
+
+\subsection{Macro Definition Documentation}
+\hypertarget{harness__argparser_8c_a6669f8e5a07e7a0e4622dd23362831e7}{\index{harness\-\_\-argparser.\-c@{harness\-\_\-argparser.\-c}!D\-E\-F\-A\-U\-L\-T\-\_\-\-S\-U\-T\-\_\-\-T\-I\-M\-E\-O\-U\-T@{D\-E\-F\-A\-U\-L\-T\-\_\-\-S\-U\-T\-\_\-\-T\-I\-M\-E\-O\-U\-T}}
+\index{D\-E\-F\-A\-U\-L\-T\-\_\-\-S\-U\-T\-\_\-\-T\-I\-M\-E\-O\-U\-T@{D\-E\-F\-A\-U\-L\-T\-\_\-\-S\-U\-T\-\_\-\-T\-I\-M\-E\-O\-U\-T}!harness_argparser.c@{harness\-\_\-argparser.\-c}}
+\subsubsection[{D\-E\-F\-A\-U\-L\-T\-\_\-\-S\-U\-T\-\_\-\-T\-I\-M\-E\-O\-U\-T}]{\setlength{\rightskip}{0pt plus 5cm}\#define D\-E\-F\-A\-U\-L\-T\-\_\-\-S\-U\-T\-\_\-\-T\-I\-M\-E\-O\-U\-T~(60 $\ast$ 1000)}}\label{harness__argparser_8c_a6669f8e5a07e7a0e4622dd23362831e7}
+Default value for the timeout after which the S\-U\-T is forcefully killed \hypertarget{harness__argparser_8c_a7186273cd88640b740b6333cd98ae243}{\index{harness\-\_\-argparser.\-c@{harness\-\_\-argparser.\-c}!M\-A\-X\-\_\-\-C\-O\-N\-F\-I\-G\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-C\-O\-N\-F\-I\-G\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N}}
+\index{M\-A\-X\-\_\-\-C\-O\-N\-F\-I\-G\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N@{M\-A\-X\-\_\-\-C\-O\-N\-F\-I\-G\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N}!harness_argparser.c@{harness\-\_\-argparser.\-c}}
+\subsubsection[{M\-A\-X\-\_\-\-C\-O\-N\-F\-I\-G\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N}]{\setlength{\rightskip}{0pt plus 5cm}\#define M\-A\-X\-\_\-\-C\-O\-N\-F\-I\-G\-\_\-\-L\-I\-N\-E\-\_\-\-L\-E\-N~400}}\label{harness__argparser_8c_a7186273cd88640b740b6333cd98ae243}
+Maximum length of one line in the config file
+
+\subsection{Function Documentation}
+\hypertarget{harness__argparser_8c_a833147d8da541982c615645a797627cc}{\index{harness\-\_\-argparser.\-c@{harness\-\_\-argparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State}!harness_argparser.c@{harness\-\_\-argparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Free\-Harness\-State (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} $\ast$}]{state}
+\end{DoxyParamCaption}
+)}}\label{harness__argparser_8c_a833147d8da541982c615645a797627cc}
+Frees any resources associated with the state object pointed to by {\ttfamily state}. \hypertarget{harness__argparser_8c_a629609acc04ef21a21fdfbbf6c1589c8}{\index{harness\-\_\-argparser.\-c@{harness\-\_\-argparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args}!harness_argparser.c@{harness\-\_\-argparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Harness\-Args (
+\begin{DoxyParamCaption}
+\item[{char $\ast$$\ast$}]{argv, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State} $\ast$}]{state}
+\end{DoxyParamCaption}
+)}}\label{harness__argparser_8c_a629609acc04ef21a21fdfbbf6c1589c8}
+Parse command line paramters to the test harness and populate a state object.
+
+
+\begin{DoxyParams}{Parameters}
+{\em argv} & The array of command line parameters. \\
+\hline
+{\em state} & Pointer to the state object to be populated.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Non-\/zero on success, zero on failure.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/index.tex b/visualtest/docs/latex/index.tex
new file mode 100755
index 000000000..ef8943caf
--- /dev/null
+++ b/visualtest/docs/latex/index.tex
@@ -0,0 +1,80 @@
+\hypertarget{index_license_sec}{}\section{License}\label{index_license_sec}
+Check the file {\ttfamily C\-O\-P\-Y\-I\-N\-G.\-txt} for licensing information.\hypertarget{index_intro_sec}{}\section{Introduction}\label{index_intro_sec}
+The goal of this G\-So\-C project is to automate the testing of testsprite2. testsprite2 takes 26 parameters which have thousands of valid combinations and is used to validate S\-D\-L's window, mouse and rendering behaviour. By having a test harness that runs testsprite2 with various command line argument strings and validates the output for each run, we can make testing an easier task for maintainers, contributors and testers. The test harness can be used by a continuous integration system (like buildbot or jenkins) to validate S\-D\-L after checkins.
+
+S\-D\-L Homepage\-: \href{http://libsdl.org/}{\tt http\-://libsdl.\-org/}\hypertarget{index_build_sec}{}\section{Building}\label{index_build_sec}
+\hypertarget{index_build_linux}{}\subsection{Building on Linux/\-Cygwin}\label{index_build_linux}
+{\ttfamily ./autogen.sh; ./configure; make;}\hypertarget{index_build_windows}{}\subsection{Building on Windows}\label{index_build_windows}
+Use the Visual Studio solution under {\ttfamily S\-D\-L/\-Visual\-C/visualtest}.\hypertarget{index_docs_sec}{}\section{Documentation}\label{index_docs_sec}
+Documentation is available via Doxygen. To build the documentation, cd to the S\-D\-L/visualtest/docs directory and run {\ttfamily doxygen}. A good starting point for exploring the documentation is {\ttfamily S\-D\-L/visualtest/docs/html/index.\-html} \hypertarget{index_usage_sec}{}\section{Usage}\label{index_usage_sec}
+To see all the options supported by the test harness, just run {\ttfamily testharness} with no arguments.
+
+At the moment the following options are supported\-: \begin{DoxyItemize}
+\item {\ttfamily sutapp} -\/ Path to the system under test (S\-U\-T) application \item {\ttfamily sutargs} -\/ Launch the S\-U\-T with the specified arguments string \item {\ttfamily timeout} -\/ The maximum time after which the S\-U\-T process will be killed; passed as hh\-:mm\-:ss; default 00\-:01\-:00 \item {\ttfamily variator} -\/ Which variator to use; see \hyperlink{index_variators_sec}{Variators} \item {\ttfamily num-\/variations} -\/ The number of variations to run for; taken to be 1 for the random variator and A\-L\-L for the exhaustive variator by default \item {\ttfamily no-\/launch} -\/ Just print the arguments string for each variation without launching the S\-U\-T or performing any actions \item {\ttfamily parameter-\/config} -\/ A config file that describes the command line parameters supported by the S\-U\-T; see \hyperlink{index_paramconfig_sec}{The S\-U\-T Parameters File} or the sample $\ast$.parameters files for more details \item {\ttfamily action-\/config} -\/ A config file with a list of actions to be performed while the S\-U\-T is running; see \hyperlink{index_actionconfig_sec}{The Actions File} or the sample $\ast$.actions files \item {\ttfamily output-\/dir} -\/ Path to the directory where screenshots should be saved; is created if it doesn't exist; taken to be \char`\"{}./output\char`\"{} by default \item {\ttfamily verify-\/dir} -\/ Path to the directory with the verification images; taken to be \char`\"{}./verify\char`\"{} by default\end{DoxyItemize}
+Paths can be relative or absolute.
+
+Alternatively, the options can be passed as a config file for convenience\-:
+
+{\ttfamily testharness -\/-\/config testsprite2\-\_\-sample.\-config}
+
+For a sample, take a look at the $\ast$.config files in this repository.
+
+We can also pass a config file and override certain options as necessary\-: {\ttfamily testharness -\/-\/config testsprite2\-\_\-sample.\-config -\/-\/num-\/variations 10}
+
+Note\-: You may find it convenient to copy the S\-U\-T executable along with any resources to the test harness directory. Also note that testsprite2 and its resources (icon.\-bmp) are automatically copied when using the Visual Studio solution.\hypertarget{index_usageexamples_subsec}{}\subsection{Usage examples\-:}\label{index_usageexamples_subsec}
+Passing a custom arguments string\-: {\ttfamily testharness -\/-\/sutapp testsprite2 -\/-\/sutargs \char`\"{}\textbackslash{}-\/\textbackslash{}-\/cyclecolor \textbackslash{}-\/\textbackslash{}-\/blend mod
+\textbackslash{}-\/\textbackslash{}-\/iterations 2\char`\"{} -\/-\/action-\/config xyz.\-actions}
+
+Using the random variator\-: {\ttfamily testharness -\/-\/sutapp testsprite2 -\/-\/variator random -\/-\/num-\/variations 5 -\/-\/parameter-\/config xyz.\-parameters -\/-\/action-\/config xyz.\-actions}\hypertarget{index_config_subsec}{}\subsection{Config Files}\label{index_config_subsec}
+Config files are an alternate way to pass parameters to the test harness. We describe the paramters in a config file and pass that to the test harness using the -\/-\/config option. The config file consists of lines of the form \char`\"{}x=y\char`\"{} where x is an option and y is it's value. For boolean options, we simply give the name of the option to indicate that it is to be passed to the testharness.
+
+The hash '\#' character can be used to start a comment from that point to the end of the line.\hypertarget{index_paramconfig_sec}{}\section{The S\-U\-T Parameters File}\label{index_paramconfig_sec}
+To generate variations we need to describe the parameters the will be passed to the S\-U\-T. This description is given in a parameters file. Each line of the parameters file (except the blank lines) represents one command line option with five comma separated fields\-: {\ttfamily name, type, values, required, categories}
+
+\begin{DoxyItemize}
+\item {\ttfamily name} is the name of the option, e.\-g., {\ttfamily -\/-\/cyclecolor}. \item {\ttfamily type} can have one of three values -\/ integer, boolean and enum. \item {\ttfamily values} -\/ for integer options this is the valid range of values the option can take, i.\-e., \mbox{[}min max\mbox{]}. For enum options this is a list of strings that the option can take, e.\-g., \mbox{[}val1 val2 val3\mbox{]}. For boolean options this field is ignored. \item {\ttfamily required} -\/ true if the option is required, false otherwise. \item {\ttfamily categories} -\/ a list of categories that the option belongs to. For example, \mbox{[}video mouse audio\mbox{]}\end{DoxyItemize}
+Just like with config files, hash characters can be used to start comments.\hypertarget{index_additionalnotes_subsec}{}\subsection{Additional Notes}\label{index_additionalnotes_subsec}
+\begin{DoxyItemize}
+\item If you want to have an option that always takes a certain value, use an enum with only one value. \item Currently there isn't any way to turn an option off, i.\-e., all options will be included in the command line options string that is generated using the config. If you don't want an option to be passed to the S\-U\-T, remove it from the config file or comment it out.\end{DoxyItemize}
+\hypertarget{index_variators_sec}{}\section{Variators}\label{index_variators_sec}
+Variators are the mechanism by which we generate strings of command line arguments to test the S\-U\-T with. A variator is quite simply an iterator that iterates through different variations of command line options. There are two variators supported at the moment\-: \begin{DoxyItemize}
+\item {\bfseries Exhaustive} -\/ Generate all possible combinations of command line arguments that are valid. \item {\bfseries Random} -\/ Generate a random variation each time the variator is called.\end{DoxyItemize}
+As an example, let's try a simple .parameters file\-:\par
+ {\ttfamily -\/-\/blend, enum, \mbox{[}add mod\mbox{]}, false, \mbox{[}\mbox{]} \par
+ -\/-\/fullscreen, boolean, \mbox{[}\mbox{]}, false, \mbox{[}\mbox{]} }
+
+The exhaustive variator would generate the following four variations\-:\par
+ {\ttfamily -\/-\/blend add \par
+ -\/-\/blend mod \par
+ -\/-\/blend add -\/-\/fullscreen \par
+ -\/-\/blend mod -\/-\/fullscreen \par
+ }
+
+The random variator would simply generate a random variation like the following\-:\par
+ {\ttfamily -\/-\/blend mod}\hypertarget{index_actionconfig_sec}{}\section{The Actions File}\label{index_actionconfig_sec}
+Once the S\-U\-T process has been launched, automated testing happens using a mechanism called actions. A list of actions is read from a file and each action is performed on the S\-U\-T process sequentially. Each line in the actions file describes an action. The format for an action is {\ttfamily hh\-:mm\-:ss A\-C\-T\-I\-O\-N\-\_\-\-N\-A\-M\-E additional parameters}. There are five actions supported at the moment\-: \begin{DoxyItemize}
+\item {\bfseries S\-C\-R\-E\-E\-N\-S\-H\-O\-T} -\/ Takes a screenshot of each window owned by the S\-U\-T process. The images are saved as {\ttfamily }\mbox{[}hash\mbox{]}\-\_\-\mbox{[}i\mbox{]}.bmp where {\ttfamily }\mbox{[}hash\mbox{]} is the 32 character long hexadecimal M\-D5 hash of the arguments string that was passed to the S\-U\-T while launching it and {\ttfamily i} is the window number. i = 1 is an exceptional case where the {\ttfamily \-\_\-}\mbox{[}i\mbox{]} is dropped and the filename is simply {\ttfamily }\mbox{[}hash\mbox{]}.bmp\par
+ Note\-: The screenshots are only of the window's client area. \item {\bfseries V\-E\-R\-I\-F\-Y} -\/ Verifies the screenshots taken by the last S\-C\-R\-E\-E\-N\-S\-H\-O\-T action by comparing them against a verification image. Each {\ttfamily }\mbox{[}hash\mbox{]}\-\_\-i.\-bmp image output by the S\-C\-R\-E\-E\-N\-S\-H\-O\-T action is compared against a {\ttfamily }\mbox{[}hash\mbox{]}.bmp image in the verify-\/dir. \item {\bfseries Q\-U\-I\-T} -\/ Gracefully quits the S\-U\-T process. On Windows this means sending a W\-M\-\_\-\-C\-L\-O\-S\-E message to each window owned by the S\-U\-T process. On Linux it means sending a S\-I\-G\-Q\-U\-I\-T signal to the S\-U\-T process. \item {\bfseries K\-I\-L\-L} -\/ Forcefully kills the S\-U\-T process. This is useful when the S\-U\-T process doesn't respond to the Q\-U\-I\-T action. \item {\bfseries L\-A\-U\-N\-C\-H \mbox{[}/path/to/executable\mbox{]} \mbox{[}args\mbox{]}} -\/ Runs an executable with {\ttfamily }\mbox{[}args\mbox{]} as the arguments string.\end{DoxyItemize}
+Just like with config files, hash characters can be used to start comments.\hypertarget{index_contint_sec}{}\section{Continuous Integration (\-C\-I)}\label{index_contint_sec}
+One of the goals of the project was to create a test harness that integrates with C\-I systems to provide automated visual and interactive testing to S\-D\-L.
+
+At the moment the test harness can be run in two modes that are useful for C\-I\-: \begin{DoxyItemize}
+\item Crash testing mode -\/ launch the S\-U\-T with every variation and all parameters, report to the C\-I if there's a crash \item Visual testing mode -\/ launch and visually verify the S\-U\-T for a smaller subset of the parameters\end{DoxyItemize}
+Look at the launch\-\_\-harness.\-sh/launch\-\_\-harness.cmd for an example scripts that run the test harness for all variations with all parameters and report an error on a crash. The script uses the testsprite2\-\_\-crashtest config, so remember to copy those files over to the test harness executable directory along with the script.\hypertarget{index_todo_sec}{}\section{T\-O\-D\-Os}\label{index_todo_sec}
+\begin{DoxyItemize}
+\item Allow specifying a clipping box along with the V\-E\-R\-I\-F\-Y action, i.\-e., hh\-:mm\-:ss V\-E\-R\-I\-F\-Y x, y, w, h \item Add support for spaces between the equals sign in test harness config files \item Implement the S\-C\-R\-E\-E\-N\-S\-H\-O\-T action on Linux \item Add a pairwise variator \item Add actions to inject keyboard/mouse events \item Add actions to manipulate the S\-U\-T window, e.\-g., minimize, restore, resize \item Add support to load and save screenshots as .pngs instead of .bmps\end{DoxyItemize}
+\hypertarget{index_issues_sec}{}\section{Known Issues}\label{index_issues_sec}
+\begin{DoxyItemize}
+\item The Q\-U\-I\-T action does not work on a testsprite2 process with multiple windows. This appears to be an issue with testsprite2. \item The S\-C\-R\-E\-E\-N\-S\-H\-O\-T action doesn't capture the testsprite2 window correctly if the --fullscreen option is supplied. It works with --fullscreen-\/desktop, however.\end{DoxyItemize}
+\hypertarget{index_moreinfo_sec}{}\section{More Information}\label{index_moreinfo_sec}
+Author Contact Info\-:\par
+ Apoorv Upreti {\ttfamily $<$\href{mailto:apoorvupreti@gmail.com}{\tt apoorvupreti@gmail.\-com}$>$}
+
+Other useful links\-:
+\begin{DoxyItemize}
+\item Project Repository\-: \href{https://bitbucket.org/nerdap/sdlvisualtest}{\tt https\-://bitbucket.\-org/nerdap/sdlvisualtest}
+\item Project Wiki\-: \href{https://github.com/nerdap/autotestsprite2/wiki}{\tt https\-://github.\-com/nerdap/autotestsprite2/wiki}
+\item Project Blog\-: \href{http://nerdap.github.io}{\tt http\-://nerdap.\-github.\-io}
+\item Verification images for testsprite2\-\_\-blendmodes\-: \href{https://www.dropbox.com/s/nm02aem76m812ng/testsprite2_blendmodes.zip}{\tt https\-://www.\-dropbox.\-com/s/nm02aem76m812ng/testsprite2\-\_\-blendmodes.\-zip}
+\item Verification images for testsprite2\-\_\-geometry\-: \href{https://www.dropbox.com/s/csypwryopaslpaf/testsprite2_geometry.zip}{\tt https\-://www.\-dropbox.\-com/s/csypwryopaslpaf/testsprite2\-\_\-geometry.\-zip}
+\end{DoxyItemize}
\ No newline at end of file
diff --git a/visualtest/docs/latex/linux__process_8c.tex b/visualtest/docs/latex/linux__process_8c.tex
new file mode 100755
index 000000000..42b01f1f2
--- /dev/null
+++ b/visualtest/docs/latex/linux__process_8c.tex
@@ -0,0 +1,16 @@
+\hypertarget{linux__process_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/linux/linux\-\_\-process.c File Reference}
+\label{linux__process_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/linux/linux\-\_\-process.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/linux/linux\-\_\-process.\-c}}
+}
+{\ttfamily \#include $<$S\-D\-L.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include $<$sys/types.\-h$>$}\\*
+{\ttfamily \#include $<$sys/wait.\-h$>$}\\*
+{\ttfamily \#include $<$unistd.\-h$>$}\\*
+{\ttfamily \#include $<$errno.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-process.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h\char`\"{}}\\*
+
+
+\subsection{Detailed Description}
+Source file for the process A\-P\-I on linux.
\ No newline at end of file
diff --git a/visualtest/docs/latex/make.bat b/visualtest/docs/latex/make.bat
new file mode 100755
index 000000000..817e9f5ea
--- /dev/null
+++ b/visualtest/docs/latex/make.bat
@@ -0,0 +1,25 @@
+del /s /f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf
+
+pdflatex refman
+echo ----
+makeindex refman.idx
+echo ----
+pdflatex refman
+
+setlocal enabledelayedexpansion
+set count=5
+:repeat
+set content=X
+for /F "tokens=*" %%T in ( 'findstr /C:"Rerun LaTeX" refman.log' ) do set content="%%~T"
+if !content! == X for /F "tokens=*" %%T in ( 'findstr /C:"Rerun to get cross-references right" refman.log' ) do set content="%%~T"
+if !content! == X goto :skip
+set /a count-=1
+if !count! EQU 0 goto :skip
+
+echo ----
+pdflatex refman
+goto :repeat
+:skip
+endlocal
+makeindex refman.idx
+pdflatex refman
diff --git a/visualtest/docs/latex/mischelper_8c.tex b/visualtest/docs/latex/mischelper_8c.tex
new file mode 100755
index 000000000..5447f5bd3
--- /dev/null
+++ b/visualtest/docs/latex/mischelper_8c.tex
@@ -0,0 +1,26 @@
+\hypertarget{mischelper_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/mischelper.c File Reference}
+\label{mischelper_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/mischelper.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/mischelper.\-c}}
+}
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+void \hyperlink{mischelper_8c_a0dae46cdb4e58bdda78676260eaaf980}{S\-D\-L\-Visual\-Test\-\_\-\-Hash\-String} (char $\ast$str, char hash\mbox{[}33\mbox{]})
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Header with miscellaneous helper functions.
+
+Source file with miscellaneous helper functions.
+
+\subsection{Function Documentation}
+\hypertarget{mischelper_8c_a0dae46cdb4e58bdda78676260eaaf980}{\index{mischelper.\-c@{mischelper.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Hash\-String@{S\-D\-L\-Visual\-Test\-\_\-\-Hash\-String}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Hash\-String@{S\-D\-L\-Visual\-Test\-\_\-\-Hash\-String}!mischelper.c@{mischelper.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Hash\-String}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Hash\-String (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{str, }
+\item[{char}]{hash\mbox{[}33\mbox{]}}
+\end{DoxyParamCaption}
+)}}\label{mischelper_8c_a0dae46cdb4e58bdda78676260eaaf980}
+Stores a 32 digit hexadecimal string representing the M\-D5 hash of the string {\ttfamily str} in {\ttfamily hash}.
\ No newline at end of file
diff --git a/visualtest/docs/latex/parsehelper_8c.tex b/visualtest/docs/latex/parsehelper_8c.tex
new file mode 100755
index 000000000..28b075c48
--- /dev/null
+++ b/visualtest/docs/latex/parsehelper_8c.tex
@@ -0,0 +1,55 @@
+\hypertarget{parsehelper_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/parsehelper.c File Reference}
+\label{parsehelper_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/parsehelper.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/parsehelper.\-c}}
+}
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h\char`\"{}}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+char $\ast$$\ast$ \hyperlink{parsehelper_8c_a508e690ed938e09fc3b724d2faf06899}{S\-D\-L\-Visual\-Test\-\_\-\-Tokenize} (char $\ast$str, int max\-\_\-token\-\_\-len)
+\item
+char $\ast$$\ast$ \hyperlink{parsehelper_8c_a5f168fdd02f9d40ddbad97bd8c0b6361}{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv} (char $\ast$args)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Source file with some helper functions for parsing strings.
+
+\subsection{Function Documentation}
+\hypertarget{parsehelper_8c_a5f168fdd02f9d40ddbad97bd8c0b6361}{\index{parsehelper.\-c@{parsehelper.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv}!parsehelper.c@{parsehelper.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Parse\-Args\-To\-Argv (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{args}
+\end{DoxyParamCaption}
+)}}\label{parsehelper_8c_a5f168fdd02f9d40ddbad97bd8c0b6361}
+Takes an string of command line arguments and breaks them up into an array based on whitespace.
+
+
+\begin{DoxyParams}{Parameters}
+{\em args} & The string of arguments.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+N\-U\-L\-L on failure, an array of strings on success. The last element of the array is N\-U\-L\-L. The first element of the array is N\-U\-L\-L and should be set to the path of the executable by the caller.
+\end{DoxyReturn}
+\hypertarget{parsehelper_8c_a508e690ed938e09fc3b724d2faf06899}{\index{parsehelper.\-c@{parsehelper.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Tokenize@{S\-D\-L\-Visual\-Test\-\_\-\-Tokenize}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Tokenize@{S\-D\-L\-Visual\-Test\-\_\-\-Tokenize}!parsehelper.c@{parsehelper.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Tokenize}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Tokenize (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{str, }
+\item[{int}]{max\-\_\-token\-\_\-len}
+\end{DoxyParamCaption}
+)}}\label{parsehelper_8c_a508e690ed938e09fc3b724d2faf06899}
+Takes a string and breaks it into tokens by splitting on whitespace.
+
+
+\begin{DoxyParams}{Parameters}
+{\em str} & The string to be split. \\
+\hline
+{\em max\-\_\-token\-\_\-len} & Length of each element in the array to be returned.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+N\-U\-L\-L on failure; an array of strings with the tokens on success. The last element of the array is N\-U\-L\-L.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/refman.tex b/visualtest/docs/latex/refman.tex
new file mode 100755
index 000000000..e181c02d4
--- /dev/null
+++ b/visualtest/docs/latex/refman.tex
@@ -0,0 +1,189 @@
+\documentclass[twoside]{book}
+
+% Packages required by doxygen
+\usepackage{calc}
+\usepackage{doxygen}
+\usepackage{graphicx}
+\usepackage[utf8]{inputenc}
+\usepackage{makeidx}
+\usepackage{multicol}
+\usepackage{multirow}
+\usepackage{textcomp}
+\usepackage[table]{xcolor}
+
+% Font selection
+\usepackage[T1]{fontenc}
+\usepackage{mathptmx}
+\usepackage[scaled=.90]{helvet}
+\usepackage{courier}
+\usepackage{amssymb}
+\usepackage{sectsty}
+\renewcommand{\familydefault}{\sfdefault}
+\allsectionsfont{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+}
+\renewcommand{\DoxyLabelFont}{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+}
+
+% Page & text layout
+\usepackage{geometry}
+\geometry{%
+ a4paper,%
+ top=2.5cm,%
+ bottom=2.5cm,%
+ left=2.5cm,%
+ right=2.5cm%
+}
+\tolerance=750
+\hfuzz=15pt
+\hbadness=750
+\setlength{\emergencystretch}{15pt}
+\setlength{\parindent}{0cm}
+\setlength{\parskip}{0.2cm}
+\makeatletter
+\renewcommand{\paragraph}{%
+ \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@parafont%
+ }%
+}
+\renewcommand{\subparagraph}{%
+ \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@subparafont%
+ }%
+}
+\makeatother
+
+% Headers & footers
+\usepackage{fancyhdr}
+\pagestyle{fancyplain}
+\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}}
+\fancyhead[CE]{\fancyplain{}{}}
+\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}}
+\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}}
+\fancyhead[CO]{\fancyplain{}{}}
+\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}}
+\fancyfoot[LE]{\fancyplain{}{}}
+\fancyfoot[CE]{\fancyplain{}{}}
+\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated on Thu Sep 26 2013 00:18:24 for SDL Visual Test by Doxygen }}
+\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated on Thu Sep 26 2013 00:18:24 for SDL Visual Test by Doxygen }}
+\fancyfoot[CO]{\fancyplain{}{}}
+\fancyfoot[RO]{\fancyplain{}{}}
+\renewcommand{\footrulewidth}{0.4pt}
+\renewcommand{\chaptermark}[1]{%
+ \markboth{#1}{}%
+}
+\renewcommand{\sectionmark}[1]{%
+ \markright{\thesection\ #1}%
+}
+
+% Indices & bibliography
+\usepackage{natbib}
+\usepackage[titles]{tocloft}
+\setcounter{tocdepth}{3}
+\setcounter{secnumdepth}{5}
+\makeindex
+
+% Hyperlinks (required, but should be loaded last)
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage[pdftex,pagebackref=true]{hyperref}
+\else
+ \usepackage[ps2pdf,pagebackref=true]{hyperref}
+\fi
+\hypersetup{%
+ colorlinks=true,%
+ linkcolor=blue,%
+ citecolor=blue,%
+ unicode%
+}
+
+% Custom commands
+\newcommand{\clearemptydoublepage}{%
+ \newpage{\pagestyle{empty}\cleardoublepage}%
+}
+
+
+%===== C O N T E N T S =====
+
+\begin{document}
+
+% Titlepage & ToC
+\hypersetup{pageanchor=false}
+\pagenumbering{roman}
+\begin{titlepage}
+\vspace*{7cm}
+\begin{center}%
+{\Large S\-D\-L Visual Test }\\
+\vspace*{1cm}
+{\large Generated by Doxygen 1.8.4}\\
+\vspace*{0.5cm}
+{\small Thu Sep 26 2013 00:18:24}\\
+\end{center}
+\end{titlepage}
+\clearemptydoublepage
+\tableofcontents
+\clearemptydoublepage
+\pagenumbering{arabic}
+\hypersetup{pageanchor=true}
+
+%--- Begin generated contents ---
+\chapter{Visual and Interactive Test Automation for S\-D\-L 2.0}
+\label{index}\hypertarget{index}{}\input{index}
+\chapter{Data Structure Index}
+\input{annotated}
+\chapter{File Index}
+\input{files}
+\chapter{Data Structure Documentation}
+\input{struct_s_d_l___process_exit_status}
+\input{struct_s_d_l___process_info}
+\input{struct_s_d_l_visual_test___action}
+\input{struct_s_d_l_visual_test___action_node}
+\input{struct_s_d_l_visual_test___action_queue}
+\input{struct_s_d_l_visual_test___exhaustive_variator}
+\input{struct_s_d_l_visual_test___harness_state}
+\input{struct_s_d_l_visual_test___random_variator}
+\input{struct_s_d_l_visual_test___r_w_helper_buffer}
+\input{struct_s_d_l_visual_test___s_u_t_config}
+\input{struct_s_d_l_visual_test___s_u_t_int_range}
+\input{struct_s_d_l_visual_test___s_u_t_option}
+\input{union_s_d_l_visual_test___s_u_t_option_value}
+\input{struct_s_d_l_visual_test___variation}
+\input{struct_s_d_l_visual_test___variator}
+\chapter{File Documentation}
+\input{_s_d_l__visualtest__action__configparser_8h}
+\input{_s_d_l__visualtest__exhaustive__variator_8h}
+\input{_s_d_l__visualtest__harness__argparser_8h}
+\input{_s_d_l__visualtest__parsehelper_8h}
+\input{_s_d_l__visualtest__process_8h}
+\input{_s_d_l__visualtest__random__variator_8h}
+\input{_s_d_l__visualtest__screenshot_8h}
+\input{_s_d_l__visualtest__sut__configparser_8h}
+\input{_s_d_l__visualtest__variator__common_8h}
+\input{_s_d_l__visualtest__variators_8h}
+\input{action__configparser_8c}
+\input{harness__argparser_8c}
+\input{linux__process_8c}
+\input{mischelper_8c}
+\input{parsehelper_8c}
+\input{rwhelper_8c}
+\input{screenshot_8c}
+\input{sut__configparser_8c}
+\input{testharness_8c}
+\input{variator__common_8c}
+\input{variator__exhaustive_8c}
+\input{variator__random_8c}
+\input{variators_8c}
+\input{windows__process_8c}
+\input{windows__screenshot_8c}
+%--- End generated contents ---
+
+% Index
+\newpage
+\phantomsection
+\addcontentsline{toc}{part}{Index}
+\printindex
+
+\end{document}
diff --git a/visualtest/docs/latex/rwhelper_8c.tex b/visualtest/docs/latex/rwhelper_8c.tex
new file mode 100755
index 000000000..0a72b7491
--- /dev/null
+++ b/visualtest/docs/latex/rwhelper_8c.tex
@@ -0,0 +1,76 @@
+\hypertarget{rwhelper_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/rwhelper.c File Reference}
+\label{rwhelper_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/rwhelper.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/rwhelper.\-c}}
+}
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-rwhelper.\-h\char`\"{}}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+void \hyperlink{rwhelper_8c_aa7878508e6d851b11dc1d1186324064a}{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Reset\-Buffer} (\hyperlink{struct_s_d_l_visual_test___r_w_helper_buffer}{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer} $\ast$buffer)
+\item
+char \hyperlink{rwhelper_8c_a92794c04d5568bde0da9f3020d88f44c}{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Char} (S\-D\-L\-\_\-\-R\-Wops $\ast$rw, \hyperlink{struct_s_d_l_visual_test___r_w_helper_buffer}{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer} $\ast$buffer)
+\item
+char $\ast$ \hyperlink{rwhelper_8c_af97cfdf8d58f716efa8fd9204666df12}{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Line} (S\-D\-L\-\_\-\-R\-Wops $\ast$rw, char $\ast$str, int size, \hyperlink{struct_s_d_l_visual_test___r_w_helper_buffer}{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer} $\ast$buffer, char comment\-\_\-char)
+\item
+int \hyperlink{rwhelper_8c_ac7f94417fa973af01a27452acd0043e8}{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Count\-Non\-Empty\-Lines} (S\-D\-L\-\_\-\-R\-Wops $\ast$rw, \hyperlink{struct_s_d_l_visual_test___r_w_helper_buffer}{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer} $\ast$buffer, char comment\-\_\-char)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Header file with some helper functions for working with S\-D\-L\-\_\-\-R\-Wops.
+
+Source file with some helper functions for working with S\-D\-L\-\_\-\-R\-Wops.
+
+\subsection{Function Documentation}
+\hypertarget{rwhelper_8c_ac7f94417fa973af01a27452acd0043e8}{\index{rwhelper.\-c@{rwhelper.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Count\-Non\-Empty\-Lines@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Count\-Non\-Empty\-Lines}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Count\-Non\-Empty\-Lines@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Count\-Non\-Empty\-Lines}!rwhelper.c@{rwhelper.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Count\-Non\-Empty\-Lines}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Count\-Non\-Empty\-Lines (
+\begin{DoxyParamCaption}
+\item[{S\-D\-L\-\_\-\-R\-Wops $\ast$}]{rw, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer} $\ast$}]{buffer, }
+\item[{char}]{comment\-\_\-char}
+\end{DoxyParamCaption}
+)}}\label{rwhelper_8c_ac7f94417fa973af01a27452acd0043e8}
+Counts the number of lines that are not all whitespace and comments using the S\-D\-L\-\_\-\-R\-Wops object pointed to by {\ttfamily rw}. {\ttfamily comment\-\_\-char} indicates the character used for comments. Uses the buffer pointed to by {\ttfamily buffer} to read data in blocks.
+
+\begin{DoxyReturn}{Returns}
+Number of lines on success, -\/1 on failure.
+\end{DoxyReturn}
+\hypertarget{rwhelper_8c_a92794c04d5568bde0da9f3020d88f44c}{\index{rwhelper.\-c@{rwhelper.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Char@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Char}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Char@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Char}!rwhelper.c@{rwhelper.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Char}]{\setlength{\rightskip}{0pt plus 5cm}char S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Char (
+\begin{DoxyParamCaption}
+\item[{S\-D\-L\-\_\-\-R\-Wops $\ast$}]{rw, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer} $\ast$}]{buffer}
+\end{DoxyParamCaption}
+)}}\label{rwhelper_8c_a92794c04d5568bde0da9f3020d88f44c}
+Reads a single character using the S\-D\-L\-\_\-\-R\-Wops object pointed to by {\ttfamily rw}. This function reads data in blocks and stores them in the buffer pointed to by {\ttfamily buffer}, so other S\-D\-L\-\_\-\-R\-Wops functions should not be used in conjunction with this function.
+
+\begin{DoxyReturn}{Returns}
+The character that was read.
+\end{DoxyReturn}
+\hypertarget{rwhelper_8c_af97cfdf8d58f716efa8fd9204666df12}{\index{rwhelper.\-c@{rwhelper.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Line@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Line}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Line@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Line}!rwhelper.c@{rwhelper.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Line}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Read\-Line (
+\begin{DoxyParamCaption}
+\item[{S\-D\-L\-\_\-\-R\-Wops $\ast$}]{rw, }
+\item[{char $\ast$}]{str, }
+\item[{int}]{size, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer} $\ast$}]{buffer, }
+\item[{char}]{comment\-\_\-char}
+\end{DoxyParamCaption}
+)}}\label{rwhelper_8c_af97cfdf8d58f716efa8fd9204666df12}
+Reads characters using the S\-D\-L\-\_\-\-R\-Wops object pointed to by {\ttfamily rw} into the character array pointed to by {\ttfamily str} (of size {\ttfamily size}) until either the array is full or a new line is encountered. If {\ttfamily comment\-\_\-char} is encountered, all characters from that position till the end of the line are ignored. The new line is not included as part of the buffer. Lines with only whitespace and comments are ignored. This function reads data in blocks and stores them in the buffer pointed to by {\ttfamily buffer}, so other S\-D\-L\-\_\-\-R\-Wops functions should not be used in conjunction with this function.
+
+\begin{DoxyReturn}{Returns}
+pointer to the string on success, N\-U\-L\-L on failure or E\-O\-F.
+\end{DoxyReturn}
+\hypertarget{rwhelper_8c_aa7878508e6d851b11dc1d1186324064a}{\index{rwhelper.\-c@{rwhelper.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Reset\-Buffer@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Reset\-Buffer}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Reset\-Buffer@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Reset\-Buffer}!rwhelper.c@{rwhelper.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Reset\-Buffer}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Reset\-Buffer (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer} $\ast$}]{buffer}
+\end{DoxyParamCaption}
+)}}\label{rwhelper_8c_aa7878508e6d851b11dc1d1186324064a}
+Resets the buffer pointed to by {\ttfamily buffer} used by some of the helper functions. This function should be called when you're using one of the helper functions with a new S\-D\-L\-\_\-\-R\-Wops object.
\ No newline at end of file
diff --git a/visualtest/docs/latex/screenshot_8c.tex b/visualtest/docs/latex/screenshot_8c.tex
new file mode 100755
index 000000000..991374fe0
--- /dev/null
+++ b/visualtest/docs/latex/screenshot_8c.tex
@@ -0,0 +1,30 @@
+\hypertarget{screenshot_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/screenshot.c File Reference}
+\label{screenshot_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/screenshot.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/screenshot.\-c}}
+}
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-mischelper.\-h\char`\"{}}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{screenshot_8c_ac7b5335651144961676abc2116c38299}{S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots} (char $\ast$args, char $\ast$test\-\_\-dir, char $\ast$verify\-\_\-dir)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Source file for the screenshot A\-P\-I.
+
+\subsection{Function Documentation}
+\hypertarget{screenshot_8c_ac7b5335651144961676abc2116c38299}{\index{screenshot.\-c@{screenshot.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots@{S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots@{S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots}!screenshot.c@{screenshot.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Verify\-Screenshots (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{args, }
+\item[{char $\ast$}]{test\-\_\-dir, }
+\item[{char $\ast$}]{verify\-\_\-dir}
+\end{DoxyParamCaption}
+)}}\label{screenshot_8c_ac7b5335651144961676abc2116c38299}
+Compare a screenshot taken previously with S\-U\-T arguments {\ttfamily args} that is located in {\ttfamily test\-\_\-dir} with a verification image that is located in {\ttfamily verify\-\_\-dir}.
+
+\begin{DoxyReturn}{Returns}
+-\/1 on failure, 0 if the images were not equal, 1 if the images are equal and 2 if the verification image is not present.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/struct_s_d_l___process_exit_status.tex b/visualtest/docs/latex/struct_s_d_l___process_exit_status.tex
new file mode 100755
index 000000000..2b9da419f
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l___process_exit_status.tex
@@ -0,0 +1,31 @@
+\hypertarget{struct_s_d_l___process_exit_status}{\section{S\-D\-L\-\_\-\-Process\-Exit\-Status Struct Reference}
+\label{struct_s_d_l___process_exit_status}\index{S\-D\-L\-\_\-\-Process\-Exit\-Status@{S\-D\-L\-\_\-\-Process\-Exit\-Status}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-process.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{struct_s_d_l___process_exit_status_a51df50c07437f2e816d6ce7ce99e1cac}{exit\-\_\-success}
+\item
+int \hyperlink{struct_s_d_l___process_exit_status_a9324a9ff7dc6697dd77f02998d5e77d7}{exit\-\_\-status}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+This structure stores the exit status (value returned by \hyperlink{testharness_8c_a0ddf1224851353fc92bfbff6f499fa97}{main()}) and whether the process exited sucessfully or not.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l___process_exit_status_a9324a9ff7dc6697dd77f02998d5e77d7}{\index{S\-D\-L\-\_\-\-Process\-Exit\-Status@{S\-D\-L\-\_\-\-Process\-Exit\-Status}!exit\-\_\-status@{exit\-\_\-status}}
+\index{exit\-\_\-status@{exit\-\_\-status}!SDL_ProcessExitStatus@{S\-D\-L\-\_\-\-Process\-Exit\-Status}}
+\subsubsection[{exit\-\_\-status}]{\setlength{\rightskip}{0pt plus 5cm}int exit\-\_\-status}}\label{struct_s_d_l___process_exit_status_a9324a9ff7dc6697dd77f02998d5e77d7}
+The exit status of the process. 8-\/bit value. \hypertarget{struct_s_d_l___process_exit_status_a51df50c07437f2e816d6ce7ce99e1cac}{\index{S\-D\-L\-\_\-\-Process\-Exit\-Status@{S\-D\-L\-\_\-\-Process\-Exit\-Status}!exit\-\_\-success@{exit\-\_\-success}}
+\index{exit\-\_\-success@{exit\-\_\-success}!SDL_ProcessExitStatus@{S\-D\-L\-\_\-\-Process\-Exit\-Status}}
+\subsubsection[{exit\-\_\-success}]{\setlength{\rightskip}{0pt plus 5cm}int exit\-\_\-success}}\label{struct_s_d_l___process_exit_status_a51df50c07437f2e816d6ce7ce99e1cac}
+Zero if the process exited successfully
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__process_8h}{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l___process_info.tex b/visualtest/docs/latex/struct_s_d_l___process_info.tex
new file mode 100755
index 000000000..2bbcf9cf3
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l___process_info.tex
@@ -0,0 +1,15 @@
+\hypertarget{struct_s_d_l___process_info}{\section{S\-D\-L\-\_\-\-Process\-Info Struct Reference}
+\label{struct_s_d_l___process_info}\index{S\-D\-L\-\_\-\-Process\-Info@{S\-D\-L\-\_\-\-Process\-Info}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-process.\-h$>$}
+
+
+
+\subsection{Detailed Description}
+Struct to store a platform specific handle to a process.
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__process_8h}{S\-D\-L\-\_\-visualtest\-\_\-process.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___action.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___action.tex
new file mode 100755
index 000000000..b153bd83e
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___action.tex
@@ -0,0 +1,47 @@
+\hypertarget{struct_s_d_l_visual_test___action}{\section{S\-D\-L\-Visual\-Test\-\_\-\-Action Struct Reference}
+\label{struct_s_d_l_visual_test___action}\index{S\-D\-L\-Visual\-Test\-\_\-\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{_s_d_l__visualtest__action__configparser_8h_a383e41b8547eab149a0a4af867b3ebc6}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Type} \hyperlink{struct_s_d_l_visual_test___action_a3ab091b672fc470015f09e6c4c50dcf1}{type}
+\item
+int \hyperlink{struct_s_d_l_visual_test___action_a42715f65f02da52edc5b22021d8ae670}{time}
+\item
+\begin{tabbing}
+xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=\kill
+union \{\\
+\>struct \{\\
+\>\>char $\ast$ {\bfseries path}\\
+\>\>char $\ast$ {\bfseries args}\\
+\>\} \hyperlink{struct_s_d_l_visual_test___action_aa43e9883c9f24718f49b984b67b1afdc}{process}\\
+\} \hyperlink{struct_s_d_l_visual_test___action_a4626514a67f261290b54fb3d85ca8ddd}{extra}\\
+
+\end{tabbing}\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Struct that defines an action that will be performed on the S\-U\-T process at a specific time.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___action_a4626514a67f261290b54fb3d85ca8ddd}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}!extra@{extra}}
+\index{extra@{extra}!SDLVisualTest_Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}}
+\subsubsection[{extra}]{\setlength{\rightskip}{0pt plus 5cm}union \{ ... \} extra}}\label{struct_s_d_l_visual_test___action_a4626514a67f261290b54fb3d85ca8ddd}
+Any additional information needed to perform the action. \hypertarget{struct_s_d_l_visual_test___action_aa43e9883c9f24718f49b984b67b1afdc}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}!process@{process}}
+\index{process@{process}!SDLVisualTest_Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}}
+\subsubsection[{process}]{\setlength{\rightskip}{0pt plus 5cm}struct \{ ... \} process}}\label{struct_s_d_l_visual_test___action_aa43e9883c9f24718f49b984b67b1afdc}
+The path and arguments to the process to be launched \hypertarget{struct_s_d_l_visual_test___action_a42715f65f02da52edc5b22021d8ae670}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}!time@{time}}
+\index{time@{time}!SDLVisualTest_Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}}
+\subsubsection[{time}]{\setlength{\rightskip}{0pt plus 5cm}int time}}\label{struct_s_d_l_visual_test___action_a42715f65f02da52edc5b22021d8ae670}
+The time, in milliseconds from the launch of the S\-U\-T, when the action will be performed \hypertarget{struct_s_d_l_visual_test___action_a3ab091b672fc470015f09e6c4c50dcf1}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}!type@{type}}
+\index{type@{type}!SDLVisualTest_Action@{S\-D\-L\-Visual\-Test\-\_\-\-Action}}
+\subsubsection[{type}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Type} type}}\label{struct_s_d_l_visual_test___action_a3ab091b672fc470015f09e6c4c50dcf1}
+The type of action to be performed
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__action__configparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___action_node.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___action_node.tex
new file mode 100755
index 000000000..a818ece3a
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___action_node.tex
@@ -0,0 +1,31 @@
+\hypertarget{struct_s_d_l_visual_test___action_node}{\section{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node Struct Reference}
+\label{struct_s_d_l_visual_test___action_node}\index{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{struct_s_d_l_visual_test___action}{S\-D\-L\-Visual\-Test\-\_\-\-Action} \hyperlink{struct_s_d_l_visual_test___action_node_af46ec45094cc74a7432626a6234c6575}{action}
+\item
+struct \hyperlink{struct_s_d_l_visual_test___action_node}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node} $\ast$ \hyperlink{struct_s_d_l_visual_test___action_node_ae6154b60b896ce1a184d060ee4664485}{next}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Struct for a node in the action queue.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___action_node_af46ec45094cc74a7432626a6234c6575}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}!action@{action}}
+\index{action@{action}!SDLVisualTest_ActionNode@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}}
+\subsubsection[{action}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action} action}}\label{struct_s_d_l_visual_test___action_node_af46ec45094cc74a7432626a6234c6575}
+The action in this node \hypertarget{struct_s_d_l_visual_test___action_node_ae6154b60b896ce1a184d060ee4664485}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}!next@{next}}
+\index{next@{next}!SDLVisualTest_ActionNode@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}}
+\subsubsection[{next}]{\setlength{\rightskip}{0pt plus 5cm}struct {\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}$\ast$ next}}\label{struct_s_d_l_visual_test___action_node_ae6154b60b896ce1a184d060ee4664485}
+Pointer to the next element in the queue
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__action__configparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___action_queue.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___action_queue.tex
new file mode 100755
index 000000000..40ecaf239
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___action_queue.tex
@@ -0,0 +1,36 @@
+\hypertarget{struct_s_d_l_visual_test___action_queue}{\section{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue Struct Reference}
+\label{struct_s_d_l_visual_test___action_queue}\index{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{struct_s_d_l_visual_test___action_node}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node} $\ast$ \hyperlink{struct_s_d_l_visual_test___action_queue_a8b810b2fd2b05698be642ee08836a452}{front}
+\item
+\hyperlink{struct_s_d_l_visual_test___action_node}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node} $\ast$ \hyperlink{struct_s_d_l_visual_test___action_queue_a4aaf4563956932c81c65d05f9020f2ce}{rear}
+\item
+int \hyperlink{struct_s_d_l_visual_test___action_queue_a439227feff9d7f55384e8780cfc2eb82}{size}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Queue structure for actions loaded from the actions config file.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___action_queue_a8b810b2fd2b05698be642ee08836a452}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}!front@{front}}
+\index{front@{front}!SDLVisualTest_ActionQueue@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}}
+\subsubsection[{front}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}$\ast$ front}}\label{struct_s_d_l_visual_test___action_queue_a8b810b2fd2b05698be642ee08836a452}
+Pointer to the front of the queue \hypertarget{struct_s_d_l_visual_test___action_queue_a4aaf4563956932c81c65d05f9020f2ce}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}!rear@{rear}}
+\index{rear@{rear}!SDLVisualTest_ActionQueue@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}}
+\subsubsection[{rear}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Node}$\ast$ rear}}\label{struct_s_d_l_visual_test___action_queue_a4aaf4563956932c81c65d05f9020f2ce}
+Pointer to the rear of the queue \hypertarget{struct_s_d_l_visual_test___action_queue_a439227feff9d7f55384e8780cfc2eb82}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}!size@{size}}
+\index{size@{size}!SDLVisualTest_ActionQueue@{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue}}
+\subsubsection[{size}]{\setlength{\rightskip}{0pt plus 5cm}int size}}\label{struct_s_d_l_visual_test___action_queue_a439227feff9d7f55384e8780cfc2eb82}
+Number of nodes in the queue
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__action__configparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-action\-\_\-configparser.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___exhaustive_variator.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___exhaustive_variator.tex
new file mode 100755
index 000000000..030308f30
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___exhaustive_variator.tex
@@ -0,0 +1,36 @@
+\hypertarget{struct_s_d_l_visual_test___exhaustive_variator}{\section{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator Struct Reference}
+\label{struct_s_d_l_visual_test___exhaustive_variator}\index{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{struct_s_d_l_visual_test___variation}{S\-D\-L\-Visual\-Test\-\_\-\-Variation} \hyperlink{struct_s_d_l_visual_test___exhaustive_variator_a11c2995cf19b41c4a1b1f8d9b4081ff7}{variation}
+\item
+\hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} \hyperlink{struct_s_d_l_visual_test___exhaustive_variator_ab66b4220589b2e2b6e1fde7d6c20bd72}{config}
+\item
+char \hyperlink{struct_s_d_l_visual_test___exhaustive_variator_a2b599af5b00be0f525ffc18feb0775a8}{buffer} \mbox{[}\hyperlink{_s_d_l__visualtest__harness__argparser_8h_a8485cbda108eca56406d67aaa685fcc5}{M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N}\mbox{]}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Struct for the variator that exhaustively iterates through all variations of command line arguments to the S\-U\-T.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___exhaustive_variator_a2b599af5b00be0f525ffc18feb0775a8}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}!buffer@{buffer}}
+\index{buffer@{buffer}!SDLVisualTest_ExhaustiveVariator@{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}}
+\subsubsection[{buffer}]{\setlength{\rightskip}{0pt plus 5cm}char buffer\mbox{[}{\bf M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N}\mbox{]}}}\label{struct_s_d_l_visual_test___exhaustive_variator_a2b599af5b00be0f525ffc18feb0775a8}
+Buffer to store the arguments string built from the variation \hypertarget{struct_s_d_l_visual_test___exhaustive_variator_ab66b4220589b2e2b6e1fde7d6c20bd72}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}!config@{config}}
+\index{config@{config}!SDLVisualTest_ExhaustiveVariator@{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}}
+\subsubsection[{config}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} config}}\label{struct_s_d_l_visual_test___exhaustive_variator_ab66b4220589b2e2b6e1fde7d6c20bd72}
+Configuration object for the S\-U\-T that the variator is running for. \hypertarget{struct_s_d_l_visual_test___exhaustive_variator_a11c2995cf19b41c4a1b1f8d9b4081ff7}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}!variation@{variation}}
+\index{variation@{variation}!SDLVisualTest_ExhaustiveVariator@{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator}}
+\subsubsection[{variation}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variation} variation}}\label{struct_s_d_l_visual_test___exhaustive_variator_a11c2995cf19b41c4a1b1f8d9b4081ff7}
+The current variation.
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__exhaustive__variator_8h}{S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___harness_state.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___harness_state.tex
new file mode 100755
index 000000000..35c315b79
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___harness_state.tex
@@ -0,0 +1,71 @@
+\hypertarget{struct_s_d_l_visual_test___harness_state}{\section{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State Struct Reference}
+\label{struct_s_d_l_visual_test___harness_state}\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+char \hyperlink{struct_s_d_l_visual_test___harness_state_af277bbb5c712eb89e92337dd583a8b74}{sutapp} \mbox{[}\hyperlink{_s_d_l__visualtest__harness__argparser_8h_abdd33f362ae3bbdacb5de76473aa8a2f}{M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N}\mbox{]}
+\item
+char \hyperlink{struct_s_d_l_visual_test___harness_state_a00fab9c7cf802b96b6b29e098292d24d}{sutargs} \mbox{[}\hyperlink{_s_d_l__visualtest__harness__argparser_8h_a8485cbda108eca56406d67aaa685fcc5}{M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N}\mbox{]}
+\item
+int \hyperlink{struct_s_d_l_visual_test___harness_state_a493b57f443cc38b3d3df9c1e584d9d82}{timeout}
+\item
+\hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} \hyperlink{struct_s_d_l_visual_test___harness_state_a42657080015a96da836e1640bbdf870e}{sut\-\_\-config}
+\item
+\hyperlink{_s_d_l__visualtest__variator__common_8h_a04bfc880abe6940d69a63c06a33acdbd}{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type} \hyperlink{struct_s_d_l_visual_test___harness_state_aaaa989ae89caee6d39c722cfe6907466}{variator\-\_\-type}
+\item
+int \hyperlink{struct_s_d_l_visual_test___harness_state_a0bd4e04c0c6be7b94e68501bb31dd62c}{num\-\_\-variations}
+\item
+S\-D\-L\-\_\-bool \hyperlink{struct_s_d_l_visual_test___harness_state_a091c0d08290b73216a736ff42ac8fa99}{no\-\_\-launch}
+\item
+\hyperlink{struct_s_d_l_visual_test___action_queue}{S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} \hyperlink{struct_s_d_l_visual_test___harness_state_ae25567527563fbd7373fa1cf7cdede61}{action\-\_\-queue}
+\item
+char \hyperlink{struct_s_d_l_visual_test___harness_state_aafa9a2fb15490380b6c2edd704f4fcf0}{output\-\_\-dir} \mbox{[}\hyperlink{_s_d_l__visualtest__harness__argparser_8h_abdd33f362ae3bbdacb5de76473aa8a2f}{M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N}\mbox{]}
+\item
+char \hyperlink{struct_s_d_l_visual_test___harness_state_adc871112f24f61e2fff74a7a7fb9794f}{verify\-\_\-dir} \mbox{[}\hyperlink{_s_d_l__visualtest__harness__argparser_8h_abdd33f362ae3bbdacb5de76473aa8a2f}{M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N}\mbox{]}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Stores the state of the test harness.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___harness_state_ae25567527563fbd7373fa1cf7cdede61}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!action\-\_\-queue@{action\-\_\-queue}}
+\index{action\-\_\-queue@{action\-\_\-queue}!SDLVisualTest_HarnessState@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\subsubsection[{action\-\_\-queue}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Action\-Queue} action\-\_\-queue}}\label{struct_s_d_l_visual_test___harness_state_ae25567527563fbd7373fa1cf7cdede61}
+A queue with actions to be performed while the S\-U\-T is running \hypertarget{struct_s_d_l_visual_test___harness_state_a091c0d08290b73216a736ff42ac8fa99}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!no\-\_\-launch@{no\-\_\-launch}}
+\index{no\-\_\-launch@{no\-\_\-launch}!SDLVisualTest_HarnessState@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\subsubsection[{no\-\_\-launch}]{\setlength{\rightskip}{0pt plus 5cm}S\-D\-L\-\_\-bool no\-\_\-launch}}\label{struct_s_d_l_visual_test___harness_state_a091c0d08290b73216a736ff42ac8fa99}
+If true, the test harness will just print the different variations without launching the S\-U\-T for each one \hypertarget{struct_s_d_l_visual_test___harness_state_a0bd4e04c0c6be7b94e68501bb31dd62c}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!num\-\_\-variations@{num\-\_\-variations}}
+\index{num\-\_\-variations@{num\-\_\-variations}!SDLVisualTest_HarnessState@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\subsubsection[{num\-\_\-variations}]{\setlength{\rightskip}{0pt plus 5cm}int num\-\_\-variations}}\label{struct_s_d_l_visual_test___harness_state_a0bd4e04c0c6be7b94e68501bb31dd62c}
+The number of variations to generate \hypertarget{struct_s_d_l_visual_test___harness_state_aafa9a2fb15490380b6c2edd704f4fcf0}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!output\-\_\-dir@{output\-\_\-dir}}
+\index{output\-\_\-dir@{output\-\_\-dir}!SDLVisualTest_HarnessState@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\subsubsection[{output\-\_\-dir}]{\setlength{\rightskip}{0pt plus 5cm}char output\-\_\-dir\mbox{[}{\bf M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N}\mbox{]}}}\label{struct_s_d_l_visual_test___harness_state_aafa9a2fb15490380b6c2edd704f4fcf0}
+Output directory to save the screenshots \hypertarget{struct_s_d_l_visual_test___harness_state_a42657080015a96da836e1640bbdf870e}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!sut\-\_\-config@{sut\-\_\-config}}
+\index{sut\-\_\-config@{sut\-\_\-config}!SDLVisualTest_HarnessState@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\subsubsection[{sut\-\_\-config}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} sut\-\_\-config}}\label{struct_s_d_l_visual_test___harness_state_a42657080015a96da836e1640bbdf870e}
+Configuration object for the S\-U\-T \hypertarget{struct_s_d_l_visual_test___harness_state_af277bbb5c712eb89e92337dd583a8b74}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!sutapp@{sutapp}}
+\index{sutapp@{sutapp}!SDLVisualTest_HarnessState@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\subsubsection[{sutapp}]{\setlength{\rightskip}{0pt plus 5cm}char sutapp\mbox{[}{\bf M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N}\mbox{]}}}\label{struct_s_d_l_visual_test___harness_state_af277bbb5c712eb89e92337dd583a8b74}
+Path to the System Under Test (S\-U\-T) executable \hypertarget{struct_s_d_l_visual_test___harness_state_a00fab9c7cf802b96b6b29e098292d24d}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!sutargs@{sutargs}}
+\index{sutargs@{sutargs}!SDLVisualTest_HarnessState@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\subsubsection[{sutargs}]{\setlength{\rightskip}{0pt plus 5cm}char sutargs\mbox{[}{\bf M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N}\mbox{]}}}\label{struct_s_d_l_visual_test___harness_state_a00fab9c7cf802b96b6b29e098292d24d}
+Command line arguments to be passed to the S\-U\-T \hypertarget{struct_s_d_l_visual_test___harness_state_a493b57f443cc38b3d3df9c1e584d9d82}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!timeout@{timeout}}
+\index{timeout@{timeout}!SDLVisualTest_HarnessState@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\subsubsection[{timeout}]{\setlength{\rightskip}{0pt plus 5cm}int timeout}}\label{struct_s_d_l_visual_test___harness_state_a493b57f443cc38b3d3df9c1e584d9d82}
+Time in milliseconds after which to kill the S\-U\-T \hypertarget{struct_s_d_l_visual_test___harness_state_aaaa989ae89caee6d39c722cfe6907466}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!variator\-\_\-type@{variator\-\_\-type}}
+\index{variator\-\_\-type@{variator\-\_\-type}!SDLVisualTest_HarnessState@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\subsubsection[{variator\-\_\-type}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type} variator\-\_\-type}}\label{struct_s_d_l_visual_test___harness_state_aaaa989ae89caee6d39c722cfe6907466}
+What type of variator to use to generate argument strings \hypertarget{struct_s_d_l_visual_test___harness_state_adc871112f24f61e2fff74a7a7fb9794f}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}!verify\-\_\-dir@{verify\-\_\-dir}}
+\index{verify\-\_\-dir@{verify\-\_\-dir}!SDLVisualTest_HarnessState@{S\-D\-L\-Visual\-Test\-\_\-\-Harness\-State}}
+\subsubsection[{verify\-\_\-dir}]{\setlength{\rightskip}{0pt plus 5cm}char verify\-\_\-dir\mbox{[}{\bf M\-A\-X\-\_\-\-P\-A\-T\-H\-\_\-\-L\-E\-N}\mbox{]}}}\label{struct_s_d_l_visual_test___harness_state_adc871112f24f61e2fff74a7a7fb9794f}
+Path to directory with the verification images
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__harness__argparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___r_w_helper_buffer.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___r_w_helper_buffer.tex
new file mode 100755
index 000000000..22367cdb8
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___r_w_helper_buffer.tex
@@ -0,0 +1,36 @@
+\hypertarget{struct_s_d_l_visual_test___r_w_helper_buffer}{\section{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer Struct Reference}
+\label{struct_s_d_l_visual_test___r_w_helper_buffer}\index{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-rwhelper.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+char \hyperlink{struct_s_d_l_visual_test___r_w_helper_buffer_a5b528063c1aaa0e626f5d5e49de5baad}{buffer} \mbox{[}R\-W\-O\-P\-S\-\_\-\-B\-U\-F\-F\-E\-R\-\_\-\-L\-E\-N\mbox{]}
+\item
+int \hyperlink{struct_s_d_l_visual_test___r_w_helper_buffer_a8a37d41b7b076eced766d7418450477d}{buffer\-\_\-pos}
+\item
+int \hyperlink{struct_s_d_l_visual_test___r_w_helper_buffer_adb2920cd89b7b8b8b014290e82746d8c}{buffer\-\_\-width}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Struct that is used as a buffer by the R\-W helper functions. Should be initialized by calling \hyperlink{rwhelper_8c_aa7878508e6d851b11dc1d1186324064a}{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Reset\-Buffer()} before being used.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___r_w_helper_buffer_a5b528063c1aaa0e626f5d5e49de5baad}{\index{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer}!buffer@{buffer}}
+\index{buffer@{buffer}!SDLVisualTest_RWHelperBuffer@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer}}
+\subsubsection[{buffer}]{\setlength{\rightskip}{0pt plus 5cm}char buffer\mbox{[}R\-W\-O\-P\-S\-\_\-\-B\-U\-F\-F\-E\-R\-\_\-\-L\-E\-N\mbox{]}}}\label{struct_s_d_l_visual_test___r_w_helper_buffer_a5b528063c1aaa0e626f5d5e49de5baad}
+Character buffer that data is read into \hypertarget{struct_s_d_l_visual_test___r_w_helper_buffer_a8a37d41b7b076eced766d7418450477d}{\index{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer}!buffer\-\_\-pos@{buffer\-\_\-pos}}
+\index{buffer\-\_\-pos@{buffer\-\_\-pos}!SDLVisualTest_RWHelperBuffer@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer}}
+\subsubsection[{buffer\-\_\-pos}]{\setlength{\rightskip}{0pt plus 5cm}int buffer\-\_\-pos}}\label{struct_s_d_l_visual_test___r_w_helper_buffer_a8a37d41b7b076eced766d7418450477d}
+buffer\mbox{[}buffer\-\_\-pos\mbox{]} is the next character to be read from the buffer \hypertarget{struct_s_d_l_visual_test___r_w_helper_buffer_adb2920cd89b7b8b8b014290e82746d8c}{\index{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer}!buffer\-\_\-width@{buffer\-\_\-width}}
+\index{buffer\-\_\-width@{buffer\-\_\-width}!SDLVisualTest_RWHelperBuffer@{S\-D\-L\-Visual\-Test\-\_\-\-R\-W\-Helper\-Buffer}}
+\subsubsection[{buffer\-\_\-width}]{\setlength{\rightskip}{0pt plus 5cm}int buffer\-\_\-width}}\label{struct_s_d_l_visual_test___r_w_helper_buffer_adb2920cd89b7b8b8b014290e82746d8c}
+Number of character read into the buffer
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/S\-D\-L\-\_\-visualtest\-\_\-rwhelper.\-h\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___random_variator.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___random_variator.tex
new file mode 100755
index 000000000..25ae5a5ef
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___random_variator.tex
@@ -0,0 +1,36 @@
+\hypertarget{struct_s_d_l_visual_test___random_variator}{\section{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator Struct Reference}
+\label{struct_s_d_l_visual_test___random_variator}\index{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{struct_s_d_l_visual_test___variation}{S\-D\-L\-Visual\-Test\-\_\-\-Variation} \hyperlink{struct_s_d_l_visual_test___random_variator_a11c2995cf19b41c4a1b1f8d9b4081ff7}{variation}
+\item
+\hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} \hyperlink{struct_s_d_l_visual_test___random_variator_ab66b4220589b2e2b6e1fde7d6c20bd72}{config}
+\item
+char \hyperlink{struct_s_d_l_visual_test___random_variator_a2b599af5b00be0f525ffc18feb0775a8}{buffer} \mbox{[}\hyperlink{_s_d_l__visualtest__harness__argparser_8h_a8485cbda108eca56406d67aaa685fcc5}{M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N}\mbox{]}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Struct for the variator that randomly generates variations of command line arguments to the S\-U\-T.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___random_variator_a2b599af5b00be0f525ffc18feb0775a8}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}!buffer@{buffer}}
+\index{buffer@{buffer}!SDLVisualTest_RandomVariator@{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}}
+\subsubsection[{buffer}]{\setlength{\rightskip}{0pt plus 5cm}char buffer\mbox{[}{\bf M\-A\-X\-\_\-\-S\-U\-T\-\_\-\-A\-R\-G\-S\-\_\-\-L\-E\-N}\mbox{]}}}\label{struct_s_d_l_visual_test___random_variator_a2b599af5b00be0f525ffc18feb0775a8}
+Buffer to store the arguments string built from the variation \hypertarget{struct_s_d_l_visual_test___random_variator_ab66b4220589b2e2b6e1fde7d6c20bd72}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}!config@{config}}
+\index{config@{config}!SDLVisualTest_RandomVariator@{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}}
+\subsubsection[{config}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} config}}\label{struct_s_d_l_visual_test___random_variator_ab66b4220589b2e2b6e1fde7d6c20bd72}
+Configuration object for the S\-U\-T that the variator is running for. \hypertarget{struct_s_d_l_visual_test___random_variator_a11c2995cf19b41c4a1b1f8d9b4081ff7}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}!variation@{variation}}
+\index{variation@{variation}!SDLVisualTest_RandomVariator@{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator}}
+\subsubsection[{variation}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variation} variation}}\label{struct_s_d_l_visual_test___random_variator_a11c2995cf19b41c4a1b1f8d9b4081ff7}
+The current variation.
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__random__variator_8h}{S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___s_u_t_config.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___s_u_t_config.tex
new file mode 100755
index 000000000..90177adb7
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___s_u_t_config.tex
@@ -0,0 +1,31 @@
+\hypertarget{struct_s_d_l_visual_test___s_u_t_config}{\section{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config Struct Reference}
+\label{struct_s_d_l_visual_test___s_u_t_config}\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{struct_s_d_l_visual_test___s_u_t_option}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option} $\ast$ \hyperlink{struct_s_d_l_visual_test___s_u_t_config_afda1bef370f3d5ea6919b7b6a73d01c0}{options}
+\item
+int \hyperlink{struct_s_d_l_visual_test___s_u_t_config_a593108c2cc4b7dd3edecefd724edfd51}{num\-\_\-options}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Struct to hold all the options to an S\-U\-T application.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___s_u_t_config_a593108c2cc4b7dd3edecefd724edfd51}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}!num\-\_\-options@{num\-\_\-options}}
+\index{num\-\_\-options@{num\-\_\-options}!SDLVisualTest_SUTConfig@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}}
+\subsubsection[{num\-\_\-options}]{\setlength{\rightskip}{0pt plus 5cm}int num\-\_\-options}}\label{struct_s_d_l_visual_test___s_u_t_config_a593108c2cc4b7dd3edecefd724edfd51}
+Number of options in {\ttfamily options} \hypertarget{struct_s_d_l_visual_test___s_u_t_config_afda1bef370f3d5ea6919b7b6a73d01c0}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}!options@{options}}
+\index{options@{options}!SDLVisualTest_SUTConfig@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config}}
+\subsubsection[{options}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}$\ast$ options}}\label{struct_s_d_l_visual_test___s_u_t_config_afda1bef370f3d5ea6919b7b6a73d01c0}
+Pointer to an array of options
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__sut__configparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___s_u_t_int_range.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___s_u_t_int_range.tex
new file mode 100755
index 000000000..28a49eb04
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___s_u_t_int_range.tex
@@ -0,0 +1,31 @@
+\hypertarget{struct_s_d_l_visual_test___s_u_t_int_range}{\section{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range Struct Reference}
+\label{struct_s_d_l_visual_test___s_u_t_int_range}\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{struct_s_d_l_visual_test___s_u_t_int_range_a3e202b201e6255d975cd6d3aff1f5a4d}{min}
+\item
+int \hyperlink{struct_s_d_l_visual_test___s_u_t_int_range_ae1e1dde676c120fa6d10f3bb2c14059e}{max}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Represents the range of values an integer option can take.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___s_u_t_int_range_ae1e1dde676c120fa6d10f3bb2c14059e}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}!max@{max}}
+\index{max@{max}!SDLVisualTest_SUTIntRange@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}}
+\subsubsection[{max}]{\setlength{\rightskip}{0pt plus 5cm}int max}}\label{struct_s_d_l_visual_test___s_u_t_int_range_ae1e1dde676c120fa6d10f3bb2c14059e}
+Maximum value of the integer option \hypertarget{struct_s_d_l_visual_test___s_u_t_int_range_a3e202b201e6255d975cd6d3aff1f5a4d}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}!min@{min}}
+\index{min@{min}!SDLVisualTest_SUTIntRange@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range}}
+\subsubsection[{min}]{\setlength{\rightskip}{0pt plus 5cm}int min}}\label{struct_s_d_l_visual_test___s_u_t_int_range_a3e202b201e6255d975cd6d3aff1f5a4d}
+Minimum value of the integer option
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__sut__configparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___s_u_t_option.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___s_u_t_option.tex
new file mode 100755
index 000000000..a6ada4a22
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___s_u_t_option.tex
@@ -0,0 +1,62 @@
+\hypertarget{struct_s_d_l_visual_test___s_u_t_option}{\section{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option Struct Reference}
+\label{struct_s_d_l_visual_test___s_u_t_option}\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+char \hyperlink{struct_s_d_l_visual_test___s_u_t_option_ad14ca616d8f7c9b61eff58baaead7f1f}{name} \mbox{[}\hyperlink{_s_d_l__visualtest__sut__configparser_8h_a0a8b0c1f8eee787abf09bf3a840eccc7}{M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-N\-A\-M\-E\-\_\-\-L\-E\-N}\mbox{]}
+\item
+char $\ast$$\ast$ \hyperlink{struct_s_d_l_visual_test___s_u_t_option_a6744d43d3ad17d06068dba9ee7b78c83}{categories}
+\item
+\hyperlink{_s_d_l__visualtest__sut__configparser_8h_af9893831d9f79360f57e84a67a90293c}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Type} \hyperlink{struct_s_d_l_visual_test___s_u_t_option_a857b9e5ccfca26034b47a5f3236d822c}{type}
+\item
+S\-D\-L\-\_\-bool \hyperlink{struct_s_d_l_visual_test___s_u_t_option_a79305c1b10f7b4defee52e1eefde8fbc}{required}
+\item
+\begin{tabbing}
+xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=\kill
+union \{\\
+\>\hyperlink{struct_s_d_l_visual_test___s_u_t_int_range}{SDLVisualTest\_SUTIntRange} \hyperlink{struct_s_d_l_visual_test___s_u_t_option_a2bb1301268866e0e41d035ea0a4914e8}{range}\\
+\>char $\ast$$\ast$ \hyperlink{struct_s_d_l_visual_test___s_u_t_option_a596ff3567c4b736561dba1915a2cd38d}{enum\_values}\\
+\} \hyperlink{struct_s_d_l_visual_test___s_u_t_option_aa9545bd4acd476f61533d04d53cdffdc}{data}\\
+
+\end{tabbing}\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Struct that defines an option to be passed to the S\-U\-T.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___s_u_t_option_a6744d43d3ad17d06068dba9ee7b78c83}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}!categories@{categories}}
+\index{categories@{categories}!SDLVisualTest_SUTOption@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}}
+\subsubsection[{categories}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$$\ast$ categories}}\label{struct_s_d_l_visual_test___s_u_t_option_a6744d43d3ad17d06068dba9ee7b78c83}
+An array of categories that the option belongs to. The last element is N\-U\-L\-L. \hypertarget{struct_s_d_l_visual_test___s_u_t_option_aa9545bd4acd476f61533d04d53cdffdc}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}!data@{data}}
+\index{data@{data}!SDLVisualTest_SUTOption@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}}
+\subsubsection[{data}]{\setlength{\rightskip}{0pt plus 5cm}union \{ ... \} data}}\label{struct_s_d_l_visual_test___s_u_t_option_aa9545bd4acd476f61533d04d53cdffdc}
+extra data that is required for certain types \hypertarget{struct_s_d_l_visual_test___s_u_t_option_a596ff3567c4b736561dba1915a2cd38d}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}!enum\-\_\-values@{enum\-\_\-values}}
+\index{enum\-\_\-values@{enum\-\_\-values}!SDLVisualTest_SUTOption@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}}
+\subsubsection[{enum\-\_\-values}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$$\ast$ enum\-\_\-values}}\label{struct_s_d_l_visual_test___s_u_t_option_a596ff3567c4b736561dba1915a2cd38d}
+\begin{DoxyVerb}This field is valid only for enum type options; it holds the list of values
+\end{DoxyVerb}
+ that the option can take. The last element is N\-U\-L\-L \hypertarget{struct_s_d_l_visual_test___s_u_t_option_ad14ca616d8f7c9b61eff58baaead7f1f}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}!name@{name}}
+\index{name@{name}!SDLVisualTest_SUTOption@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}}
+\subsubsection[{name}]{\setlength{\rightskip}{0pt plus 5cm}char name\mbox{[}{\bf M\-A\-X\-\_\-\-S\-U\-T\-O\-P\-T\-I\-O\-N\-\_\-\-N\-A\-M\-E\-\_\-\-L\-E\-N}\mbox{]}}}\label{struct_s_d_l_visual_test___s_u_t_option_ad14ca616d8f7c9b61eff58baaead7f1f}
+The name of the option. This is what you would pass in the command line along with two leading hyphens. \hypertarget{struct_s_d_l_visual_test___s_u_t_option_a2bb1301268866e0e41d035ea0a4914e8}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}!range@{range}}
+\index{range@{range}!SDLVisualTest_SUTOption@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}}
+\subsubsection[{range}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Int\-Range} range}}\label{struct_s_d_l_visual_test___s_u_t_option_a2bb1301268866e0e41d035ea0a4914e8}
+\begin{DoxyVerb}This field is valid only for integer type options; it defines the
+\end{DoxyVerb}
+ valid range for such an option \hypertarget{struct_s_d_l_visual_test___s_u_t_option_a79305c1b10f7b4defee52e1eefde8fbc}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}!required@{required}}
+\index{required@{required}!SDLVisualTest_SUTOption@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}}
+\subsubsection[{required}]{\setlength{\rightskip}{0pt plus 5cm}S\-D\-L\-\_\-bool required}}\label{struct_s_d_l_visual_test___s_u_t_option_a79305c1b10f7b4defee52e1eefde8fbc}
+Whether the option is required or not \hypertarget{struct_s_d_l_visual_test___s_u_t_option_a857b9e5ccfca26034b47a5f3236d822c}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}!type@{type}}
+\index{type@{type}!SDLVisualTest_SUTOption@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option}}
+\subsubsection[{type}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Type} type}}\label{struct_s_d_l_visual_test___s_u_t_option_a857b9e5ccfca26034b47a5f3236d822c}
+Type of the option -\/ integer, boolean, etc.
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__sut__configparser_8h}{S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___variation.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___variation.tex
new file mode 100755
index 000000000..846aa2c17
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___variation.tex
@@ -0,0 +1,31 @@
+\hypertarget{struct_s_d_l_visual_test___variation}{\section{S\-D\-L\-Visual\-Test\-\_\-\-Variation Struct Reference}
+\label{struct_s_d_l_visual_test___variation}\index{S\-D\-L\-Visual\-Test\-\_\-\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Variation}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{union_s_d_l_visual_test___s_u_t_option_value}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value} $\ast$ \hyperlink{struct_s_d_l_visual_test___variation_a1eab2e90f0195b4f4632eb19523aeadf}{vars}
+\item
+int \hyperlink{struct_s_d_l_visual_test___variation_a2daded0b80f9ab7ed3703cc2686e5a92}{num\-\_\-vars}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Represents a valid combination of parameters that can be passed to the S\-U\-T. The ordering of the values here is the same as the ordering of the options in the \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} object for this variation.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___variation_a2daded0b80f9ab7ed3703cc2686e5a92}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Variation}!num\-\_\-vars@{num\-\_\-vars}}
+\index{num\-\_\-vars@{num\-\_\-vars}!SDLVisualTest_Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Variation}}
+\subsubsection[{num\-\_\-vars}]{\setlength{\rightskip}{0pt plus 5cm}int num\-\_\-vars}}\label{struct_s_d_l_visual_test___variation_a2daded0b80f9ab7ed3703cc2686e5a92}
+Number of option values in {\ttfamily vars} \hypertarget{struct_s_d_l_visual_test___variation_a1eab2e90f0195b4f4632eb19523aeadf}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Variation}!vars@{vars}}
+\index{vars@{vars}!SDLVisualTest_Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Variation}}
+\subsubsection[{vars}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}$\ast$ vars}}\label{struct_s_d_l_visual_test___variation_a1eab2e90f0195b4f4632eb19523aeadf}
+Pointer to array of option values
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__variator__common_8h}{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/struct_s_d_l_visual_test___variator.tex b/visualtest/docs/latex/struct_s_d_l_visual_test___variator.tex
new file mode 100755
index 000000000..f834ddfca
--- /dev/null
+++ b/visualtest/docs/latex/struct_s_d_l_visual_test___variator.tex
@@ -0,0 +1,37 @@
+\hypertarget{struct_s_d_l_visual_test___variator}{\section{S\-D\-L\-Visual\-Test\-\_\-\-Variator Struct Reference}
+\label{struct_s_d_l_visual_test___variator}\index{S\-D\-L\-Visual\-Test\-\_\-\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Variator}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-variators.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{_s_d_l__visualtest__variator__common_8h_a04bfc880abe6940d69a63c06a33acdbd}{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type} \hyperlink{struct_s_d_l_visual_test___variator_a24d4399dc1877c1843e120e7b027ae64}{type}
+\item
+\begin{tabbing}
+xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=\kill
+union \{\\
+\>\hyperlink{struct_s_d_l_visual_test___exhaustive_variator}{SDLVisualTest\_ExhaustiveVariator} {\bfseries exhaustive}\\
+\>\hyperlink{struct_s_d_l_visual_test___random_variator}{SDLVisualTest\_RandomVariator} {\bfseries random}\\
+\} \hyperlink{struct_s_d_l_visual_test___variator_af99a8790e729d599c656a2070e672e9a}{data}\\
+
+\end{tabbing}\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Struct that acts like a wrapper around the different types of variators available.
+
+\subsection{Field Documentation}
+\hypertarget{struct_s_d_l_visual_test___variator_af99a8790e729d599c656a2070e672e9a}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Variator}!data@{data}}
+\index{data@{data}!SDLVisualTest_Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Variator}}
+\subsubsection[{data}]{\setlength{\rightskip}{0pt plus 5cm}union \{ ... \} data}}\label{struct_s_d_l_visual_test___variator_af99a8790e729d599c656a2070e672e9a}
+union object that stores the variator \hypertarget{struct_s_d_l_visual_test___variator_a24d4399dc1877c1843e120e7b027ae64}{\index{S\-D\-L\-Visual\-Test\-\_\-\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Variator}!type@{type}}
+\index{type@{type}!SDLVisualTest_Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Variator}}
+\subsubsection[{type}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type} type}}\label{struct_s_d_l_visual_test___variator_a24d4399dc1877c1843e120e7b027ae64}
+Type of the variator
+
+The documentation for this struct was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__variators_8h}{S\-D\-L\-\_\-visualtest\-\_\-variators.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/sut__configparser_8c.tex b/visualtest/docs/latex/sut__configparser_8c.tex
new file mode 100755
index 000000000..429fe7070
--- /dev/null
+++ b/visualtest/docs/latex/sut__configparser_8c.tex
@@ -0,0 +1,50 @@
+\hypertarget{sut__configparser_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/sut\-\_\-configparser.c File Reference}
+\label{sut__configparser_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/sut\-\_\-configparser.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/sut\-\_\-configparser.\-c}}
+}
+{\ttfamily \#include $<$limits.\-h$>$}\\*
+{\ttfamily \#include $<$string.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-rwops.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-parsehelper.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-rwhelper.\-h\char`\"{}}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{sut__configparser_8c_a8e178cd8a1f279f5d2cf908545e97544}{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config} (char $\ast$file, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config)
+\item
+void \hyperlink{sut__configparser_8c_a1bddf9732c0d3ed1c24455d22193de9a}{S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config} (\hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Source file for the parser for S\-U\-T config files.
+
+\subsection{Function Documentation}
+\hypertarget{sut__configparser_8c_a1bddf9732c0d3ed1c24455d22193de9a}{\index{sut\-\_\-configparser.\-c@{sut\-\_\-configparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config}!sut_configparser.c@{sut\-\_\-configparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Free\-S\-U\-T\-Config (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config}
+\end{DoxyParamCaption}
+)}}\label{sut__configparser_8c_a1bddf9732c0d3ed1c24455d22193de9a}
+Free any resources associated with the config object pointed to by {\ttfamily config}. \hypertarget{sut__configparser_8c_a8e178cd8a1f279f5d2cf908545e97544}{\index{sut\-\_\-configparser.\-c@{sut\-\_\-configparser.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config@{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config}!sut_configparser.c@{sut\-\_\-configparser.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Parse\-S\-U\-T\-Config (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{file, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config}
+\end{DoxyParamCaption}
+)}}\label{sut__configparser_8c_a8e178cd8a1f279f5d2cf908545e97544}
+Parses a configuration file that describes the command line options an S\-U\-T application will take and populates a S\-U\-T config object. All lines in the config file must be smaller than
+
+
+\begin{DoxyParams}{Parameters}
+{\em file} & Path to the configuration file. \\
+\hline
+{\em config} & Pointer to an object that represents an S\-U\-T configuration.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+zero on failure, non-\/zero on success
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/testharness_8c.tex b/visualtest/docs/latex/testharness_8c.tex
new file mode 100755
index 000000000..b3b7bb103
--- /dev/null
+++ b/visualtest/docs/latex/testharness_8c.tex
@@ -0,0 +1,68 @@
+\hypertarget{testharness_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/testharness.c File Reference}
+\label{testharness_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/testharness.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/testharness.\-c}}
+}
+{\ttfamily \#include $<$stdlib.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-assert.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-harness\-\_\-argparser.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-process.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-variators.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-screenshot.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-mischelper.\-h\char`\"{}}\\*
+\subsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \hyperlink{testharness_8c_a0d1d5d1394089a10f0147ed2b89c1165}{A\-C\-T\-I\-O\-N\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T}~0
+\item
+\#define \hyperlink{testharness_8c_acdc6cb4935ca89fbe3fda31a8f533b9a}{K\-I\-L\-L\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T}~1
+\item
+\#define \hyperlink{testharness_8c_a70102426e83ed3944f9c060bd82fb54e}{A\-C\-T\-I\-O\-N\-\_\-\-L\-O\-O\-P\-\_\-\-F\-P\-S}~10
+\item
+\#define \hyperlink{testharness_8c_a562e15dd66cf158c98dbfec9f6afa1ae}{T\-E\-S\-T\-\_\-\-P\-A\-S\-S\-E\-D}~1
+\item
+\#define \hyperlink{testharness_8c_a8b8b91205df891e2c7837bd03795306f}{T\-E\-S\-T\-\_\-\-F\-A\-I\-L\-E\-D}~0
+\item
+\#define \hyperlink{testharness_8c_a8251bcdfc5c83845e0834adf211de033}{T\-E\-S\-T\-\_\-\-E\-R\-R\-O\-R}~-\/1
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{testharness_8c_a0ddf1224851353fc92bfbff6f499fa97}{main} (int argc, char $\ast$argv\mbox{[}$\,$\mbox{]})
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Source file for the test harness.
+
+\subsection{Macro Definition Documentation}
+\hypertarget{testharness_8c_a70102426e83ed3944f9c060bd82fb54e}{\index{testharness.\-c@{testharness.\-c}!A\-C\-T\-I\-O\-N\-\_\-\-L\-O\-O\-P\-\_\-\-F\-P\-S@{A\-C\-T\-I\-O\-N\-\_\-\-L\-O\-O\-P\-\_\-\-F\-P\-S}}
+\index{A\-C\-T\-I\-O\-N\-\_\-\-L\-O\-O\-P\-\_\-\-F\-P\-S@{A\-C\-T\-I\-O\-N\-\_\-\-L\-O\-O\-P\-\_\-\-F\-P\-S}!testharness.c@{testharness.\-c}}
+\subsubsection[{A\-C\-T\-I\-O\-N\-\_\-\-L\-O\-O\-P\-\_\-\-F\-P\-S}]{\setlength{\rightskip}{0pt plus 5cm}\#define A\-C\-T\-I\-O\-N\-\_\-\-L\-O\-O\-P\-\_\-\-F\-P\-S~10}}\label{testharness_8c_a70102426e83ed3944f9c060bd82fb54e}
+F\-P\-S value used for delays in the action loop \hypertarget{testharness_8c_a0d1d5d1394089a10f0147ed2b89c1165}{\index{testharness.\-c@{testharness.\-c}!A\-C\-T\-I\-O\-N\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T@{A\-C\-T\-I\-O\-N\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T}}
+\index{A\-C\-T\-I\-O\-N\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T@{A\-C\-T\-I\-O\-N\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T}!testharness.c@{testharness.\-c}}
+\subsubsection[{A\-C\-T\-I\-O\-N\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T}]{\setlength{\rightskip}{0pt plus 5cm}\#define A\-C\-T\-I\-O\-N\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T~0}}\label{testharness_8c_a0d1d5d1394089a10f0147ed2b89c1165}
+Code for the user event triggered when a new action is to be executed \hypertarget{testharness_8c_acdc6cb4935ca89fbe3fda31a8f533b9a}{\index{testharness.\-c@{testharness.\-c}!K\-I\-L\-L\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T@{K\-I\-L\-L\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T}}
+\index{K\-I\-L\-L\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T@{K\-I\-L\-L\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T}!testharness.c@{testharness.\-c}}
+\subsubsection[{K\-I\-L\-L\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T}]{\setlength{\rightskip}{0pt plus 5cm}\#define K\-I\-L\-L\-\_\-\-T\-I\-M\-E\-R\-\_\-\-E\-V\-E\-N\-T~1}}\label{testharness_8c_acdc6cb4935ca89fbe3fda31a8f533b9a}
+Code for the user event triggered when the maximum timeout is reached \hypertarget{testharness_8c_a8251bcdfc5c83845e0834adf211de033}{\index{testharness.\-c@{testharness.\-c}!T\-E\-S\-T\-\_\-\-E\-R\-R\-O\-R@{T\-E\-S\-T\-\_\-\-E\-R\-R\-O\-R}}
+\index{T\-E\-S\-T\-\_\-\-E\-R\-R\-O\-R@{T\-E\-S\-T\-\_\-\-E\-R\-R\-O\-R}!testharness.c@{testharness.\-c}}
+\subsubsection[{T\-E\-S\-T\-\_\-\-E\-R\-R\-O\-R}]{\setlength{\rightskip}{0pt plus 5cm}\#define T\-E\-S\-T\-\_\-\-E\-R\-R\-O\-R~-\/1}}\label{testharness_8c_a8251bcdfc5c83845e0834adf211de033}
+Value returned by Run\-S\-U\-T\-And\-Test() on a fatal error \hypertarget{testharness_8c_a8b8b91205df891e2c7837bd03795306f}{\index{testharness.\-c@{testharness.\-c}!T\-E\-S\-T\-\_\-\-F\-A\-I\-L\-E\-D@{T\-E\-S\-T\-\_\-\-F\-A\-I\-L\-E\-D}}
+\index{T\-E\-S\-T\-\_\-\-F\-A\-I\-L\-E\-D@{T\-E\-S\-T\-\_\-\-F\-A\-I\-L\-E\-D}!testharness.c@{testharness.\-c}}
+\subsubsection[{T\-E\-S\-T\-\_\-\-F\-A\-I\-L\-E\-D}]{\setlength{\rightskip}{0pt plus 5cm}\#define T\-E\-S\-T\-\_\-\-F\-A\-I\-L\-E\-D~0}}\label{testharness_8c_a8b8b91205df891e2c7837bd03795306f}
+Value returned by Run\-S\-U\-T\-And\-Test() when the test has failed \hypertarget{testharness_8c_a562e15dd66cf158c98dbfec9f6afa1ae}{\index{testharness.\-c@{testharness.\-c}!T\-E\-S\-T\-\_\-\-P\-A\-S\-S\-E\-D@{T\-E\-S\-T\-\_\-\-P\-A\-S\-S\-E\-D}}
+\index{T\-E\-S\-T\-\_\-\-P\-A\-S\-S\-E\-D@{T\-E\-S\-T\-\_\-\-P\-A\-S\-S\-E\-D}!testharness.c@{testharness.\-c}}
+\subsubsection[{T\-E\-S\-T\-\_\-\-P\-A\-S\-S\-E\-D}]{\setlength{\rightskip}{0pt plus 5cm}\#define T\-E\-S\-T\-\_\-\-P\-A\-S\-S\-E\-D~1}}\label{testharness_8c_a562e15dd66cf158c98dbfec9f6afa1ae}
+Value returned by Run\-S\-U\-T\-And\-Test() when the test has passed
+
+\subsection{Function Documentation}
+\hypertarget{testharness_8c_a0ddf1224851353fc92bfbff6f499fa97}{\index{testharness.\-c@{testharness.\-c}!main@{main}}
+\index{main@{main}!testharness.c@{testharness.\-c}}
+\subsubsection[{main}]{\setlength{\rightskip}{0pt plus 5cm}int main (
+\begin{DoxyParamCaption}
+\item[{int}]{argc, }
+\item[{char $\ast$}]{argv\mbox{[}$\,$\mbox{]}}
+\end{DoxyParamCaption}
+)}}\label{testharness_8c_a0ddf1224851353fc92bfbff6f499fa97}
+Entry point for testharness
\ No newline at end of file
diff --git a/visualtest/docs/latex/union_s_d_l_visual_test___s_u_t_option_value.tex b/visualtest/docs/latex/union_s_d_l_visual_test___s_u_t_option_value.tex
new file mode 100755
index 000000000..5c2a05e4d
--- /dev/null
+++ b/visualtest/docs/latex/union_s_d_l_visual_test___s_u_t_option_value.tex
@@ -0,0 +1,59 @@
+\hypertarget{union_s_d_l_visual_test___s_u_t_option_value}{\section{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value Union Reference}
+\label{union_s_d_l_visual_test___s_u_t_option_value}\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}}
+}
+
+
+{\ttfamily \#include $<$S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+S\-D\-L\-\_\-bool \hyperlink{union_s_d_l_visual_test___s_u_t_option_value_ace8ec6519c056e35443a6c401f3d0941}{bool\-\_\-value}
+\item
+\begin{tabbing}
+xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=\kill
+struct \{\\
+\>int {\bfseries value}\\
+\>SDL\_bool {\bfseries on}\\
+\} \hyperlink{union_s_d_l_visual_test___s_u_t_option_value_a4291d9ad3cfb3fe1645ea2732e11d68a}{integer}\\
+
+\end{tabbing}\item
+\begin{tabbing}
+xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=\kill
+struct \{\\
+\>int {\bfseries index}\\
+\>SDL\_bool {\bfseries on}\\
+\} \hyperlink{union_s_d_l_visual_test___s_u_t_option_value_ad40e26afd4b8532327b61897d5b009e3}{enumerated}\\
+
+\end{tabbing}\item
+\begin{tabbing}
+xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=\kill
+struct \{\\
+\>char $\ast$ {\bfseries value}\\
+\>SDL\_bool {\bfseries on}\\
+\} \hyperlink{union_s_d_l_visual_test___s_u_t_option_value_a2bf4b969ff9633c937e4d15118d1edc6}{string}\\
+
+\end{tabbing}\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+One possible value for a command line option to the S\-U\-T.
+
+\subsection{Field Documentation}
+\hypertarget{union_s_d_l_visual_test___s_u_t_option_value_ace8ec6519c056e35443a6c401f3d0941}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}!bool\-\_\-value@{bool\-\_\-value}}
+\index{bool\-\_\-value@{bool\-\_\-value}!SDLVisualTest_SUTOptionValue@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}}
+\subsubsection[{bool\-\_\-value}]{\setlength{\rightskip}{0pt plus 5cm}S\-D\-L\-\_\-bool bool\-\_\-value}}\label{union_s_d_l_visual_test___s_u_t_option_value_ace8ec6519c056e35443a6c401f3d0941}
+Value if the option is of type boolean \hypertarget{union_s_d_l_visual_test___s_u_t_option_value_ad40e26afd4b8532327b61897d5b009e3}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}!enumerated@{enumerated}}
+\index{enumerated@{enumerated}!SDLVisualTest_SUTOptionValue@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}}
+\subsubsection[{enumerated}]{\setlength{\rightskip}{0pt plus 5cm}struct \{ ... \} enumerated}}\label{union_s_d_l_visual_test___s_u_t_option_value_ad40e26afd4b8532327b61897d5b009e3}
+Index of the string in the enum\-\_\-values field of the corresponding \hyperlink{struct_s_d_l_visual_test___s_u_t_option}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option} object. If on is true the option will passed to the S\-U\-T, otherwise it will be ignored. \hypertarget{union_s_d_l_visual_test___s_u_t_option_value_a4291d9ad3cfb3fe1645ea2732e11d68a}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}!integer@{integer}}
+\index{integer@{integer}!SDLVisualTest_SUTOptionValue@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}}
+\subsubsection[{integer}]{\setlength{\rightskip}{0pt plus 5cm}struct \{ ... \} integer}}\label{union_s_d_l_visual_test___s_u_t_option_value_a4291d9ad3cfb3fe1645ea2732e11d68a}
+Value if the option is of type integer. If on is true then the option will be passed to the S\-U\-T, otherwise it will be ignored. \hypertarget{union_s_d_l_visual_test___s_u_t_option_value_a2bf4b969ff9633c937e4d15118d1edc6}{\index{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}!string@{string}}
+\index{string@{string}!SDLVisualTest_SUTOptionValue@{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value}}
+\subsubsection[{string}]{\setlength{\rightskip}{0pt plus 5cm}struct \{ ... \} string}}\label{union_s_d_l_visual_test___s_u_t_option_value_a2bf4b969ff9633c937e4d15118d1edc6}
+Value if the option is of type string. If on is true the option will be passed to the S\-U\-T, otherwise it will be ignored.
+
+The documentation for this union was generated from the following file\-:\begin{DoxyCompactItemize}
+\item
+C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/include/\hyperlink{_s_d_l__visualtest__variator__common_8h}{S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h}\end{DoxyCompactItemize}
diff --git a/visualtest/docs/latex/variator__common_8c.tex b/visualtest/docs/latex/variator__common_8c.tex
new file mode 100755
index 000000000..a88bc08e9
--- /dev/null
+++ b/visualtest/docs/latex/variator__common_8c.tex
@@ -0,0 +1,85 @@
+\hypertarget{variator__common_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variator\-\_\-common.c File Reference}
+\label{variator__common_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variator\-\_\-common.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variator\-\_\-common.\-c}}
+}
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-variator\-\_\-common.\-h\char`\"{}}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{variator__common_8c_aafcecc06c8feb24b6f6a509bfa9db681}{S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value} (\hyperlink{union_s_d_l_visual_test___s_u_t_option_value}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value} $\ast$var, \hyperlink{struct_s_d_l_visual_test___s_u_t_option}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option} $\ast$opt)
+\item
+int \hyperlink{variator__common_8c_ad981c2efab849e76dc878ef8da9d6017}{S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation} (\hyperlink{struct_s_d_l_visual_test___variation}{S\-D\-L\-Visual\-Test\-\_\-\-Variation} $\ast$variation, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config, char $\ast$buffer, int size)
+\item
+int \hyperlink{variator__common_8c_ac87934906c51364778dc910ebca47b6c}{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation} (\hyperlink{struct_s_d_l_visual_test___variation}{S\-D\-L\-Visual\-Test\-\_\-\-Variation} $\ast$variation, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Source file for some common functionality used by variators.
+
+\subsection{Function Documentation}
+\hypertarget{variator__common_8c_ac87934906c51364778dc910ebca47b6c}{\index{variator\-\_\-common.\-c@{variator\-\_\-common.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation}!variator_common.c@{variator\-\_\-common.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variation (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variation} $\ast$}]{variation, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config}
+\end{DoxyParamCaption}
+)}}\label{variator__common_8c_ac87934906c51364778dc910ebca47b6c}
+Initializes the variation using the following rules\-:
+\begin{DoxyItemize}
+\item Boolean options are initialized to S\-D\-L\-\_\-\-F\-A\-L\-S\-E.
+\item Integer options are initialized to the minimum valid value they can hold.
+\item Enum options are initialized to the first element in the list of values they can take.
+\item String options are initialized to the name of the option.
+\end{DoxyItemize}
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure.
+\end{DoxyReturn}
+\hypertarget{variator__common_8c_ad981c2efab849e76dc878ef8da9d6017}{\index{variator\-\_\-common.\-c@{variator\-\_\-common.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation}!variator_common.c@{variator\-\_\-common.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Make\-Str\-From\-Variation (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variation} $\ast$}]{variation, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config, }
+\item[{char $\ast$}]{buffer, }
+\item[{int}]{size}
+\end{DoxyParamCaption}
+)}}\label{variator__common_8c_ad981c2efab849e76dc878ef8da9d6017}
+Converts a variation object into a string of command line arguments.
+
+
+\begin{DoxyParams}{Parameters}
+{\em variation} & Variation object to be converted. \\
+\hline
+{\em config} & Config object for the S\-U\-T. \\
+\hline
+{\em buffer} & Pointer to the buffer the arguments string will be copied into. \\
+\hline
+{\em size} & Size of the buffer.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure
+\end{DoxyReturn}
+\hypertarget{variator__common_8c_aafcecc06c8feb24b6f6a509bfa9db681}{\index{variator\-\_\-common.\-c@{variator\-\_\-common.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value@{S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value}!variator_common.c@{variator\-\_\-common.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Next\-Value (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option\-Value} $\ast$}]{var, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Option} $\ast$}]{opt}
+\end{DoxyParamCaption}
+)}}\label{variator__common_8c_aafcecc06c8feb24b6f6a509bfa9db681}
+\char`\"{}\-Increments\char`\"{} the value of the option by one and returns the carry. We wrap around to the initial value on overflow which makes the carry one. For example\-: \char`\"{}incrementing\char`\"{} an S\-D\-L\-\_\-\-F\-A\-L\-S\-E option makes it S\-D\-L\-\_\-\-T\-R\-U\-E with no carry, and \char`\"{}incrementing\char`\"{} an S\-D\-L\-\_\-\-T\-R\-U\-E option makes it S\-D\-L\-\_\-\-F\-A\-L\-S\-E with carry one. For integers, a random value in the valid range for the option is used.
+
+
+\begin{DoxyParams}{Parameters}
+{\em var} & Value of the option \\
+\hline
+{\em opt} & Object with metadata about the option\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+1 if there is a carry for enum and bool type options, 0 otherwise. 1 is always returned for integer and string type options. -\/1 is returned on error.
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/variator__exhaustive_8c.tex b/visualtest/docs/latex/variator__exhaustive_8c.tex
new file mode 100755
index 000000000..104baf3b5
--- /dev/null
+++ b/visualtest/docs/latex/variator__exhaustive_8c.tex
@@ -0,0 +1,54 @@
+\hypertarget{variator__exhaustive_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variator\-\_\-exhaustive.c File Reference}
+\label{variator__exhaustive_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variator\-\_\-exhaustive.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variator\-\_\-exhaustive.\-c}}
+}
+{\ttfamily \#include $<$time.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-sut\-\_\-configparser.\-h\char`\"{}}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-exhaustive\-\_\-variator.\-h\char`\"{}}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{variator__exhaustive_8c_a9e213e530ddf5a18014786d10e9fdaee}{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator} (\hyperlink{struct_s_d_l_visual_test___exhaustive_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$variator, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config)
+\item
+char $\ast$ \hyperlink{variator__exhaustive_8c_aa9e13a92945ef48308215b3fa068ed29}{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation} (\hyperlink{struct_s_d_l_visual_test___exhaustive_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$variator)
+\item
+void \hyperlink{variator__exhaustive_8c_a7168b055fb86bbbb700d87ae842f7152}{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator} (\hyperlink{struct_s_d_l_visual_test___exhaustive_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$variator)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Source file for the variator that tests the S\-U\-T with all the different variations of input parameters that are valid.
+
+\subsection{Function Documentation}
+\hypertarget{variator__exhaustive_8c_a7168b055fb86bbbb700d87ae842f7152}{\index{variator\-\_\-exhaustive.\-c@{variator\-\_\-exhaustive.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator}!variator_exhaustive.c@{variator\-\_\-exhaustive.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Free\-Exhaustive\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{variator__exhaustive_8c_a7168b055fb86bbbb700d87ae842f7152}
+Frees any resources associated with the variator. \hypertarget{variator__exhaustive_8c_aa9e13a92945ef48308215b3fa068ed29}{\index{variator\-\_\-exhaustive.\-c@{variator\-\_\-exhaustive.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation}!variator_exhaustive.c@{variator\-\_\-exhaustive.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Exhaustive\-Variation (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{variator__exhaustive_8c_aa9e13a92945ef48308215b3fa068ed29}
+Gets the arguments string for the next variation using the variator and updates the variator's current variation object to the next variation.
+
+\begin{DoxyReturn}{Returns}
+The arguments string representing the next variation on success, and N\-U\-L\-L on failure or if we have iterated through all possible variations. In the latter case subsequent calls will start the variations again from the very beginning. The pointer returned should not be freed.
+\end{DoxyReturn}
+\hypertarget{variator__exhaustive_8c_a9e213e530ddf5a18014786d10e9fdaee}{\index{variator\-\_\-exhaustive.\-c@{variator\-\_\-exhaustive.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator}!variator_exhaustive.c@{variator\-\_\-exhaustive.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Init\-Exhaustive\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Exhaustive\-Variator} $\ast$}]{variator, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config}
+\end{DoxyParamCaption}
+)}}\label{variator__exhaustive_8c_a9e213e530ddf5a18014786d10e9fdaee}
+Initializes the variator.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/variator__random_8c.tex b/visualtest/docs/latex/variator__random_8c.tex
new file mode 100755
index 000000000..d8109cdb2
--- /dev/null
+++ b/visualtest/docs/latex/variator__random_8c.tex
@@ -0,0 +1,54 @@
+\hypertarget{variator__random_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variator\-\_\-random.c File Reference}
+\label{variator__random_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variator\-\_\-random.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variator\-\_\-random.\-c}}
+}
+{\ttfamily \#include $<$time.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-random\-\_\-variator.\-h\char`\"{}}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{variator__random_8c_a807486069b7180c3b3bf8af4616d055f}{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator} (\hyperlink{struct_s_d_l_visual_test___random_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$variator, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config, Uint64 seed)
+\item
+char $\ast$ \hyperlink{variator__random_8c_a479aceb74b5355c1d22856fc7efce890}{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation} (\hyperlink{struct_s_d_l_visual_test___random_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$variator)
+\item
+void \hyperlink{variator__random_8c_ac95d9e0716e4c918c6902b10f9591d4b}{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator} (\hyperlink{struct_s_d_l_visual_test___random_variator}{S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$variator)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Source file for the variator that tests the S\-U\-T with random variations to the input parameters.
+
+\subsection{Function Documentation}
+\hypertarget{variator__random_8c_ac95d9e0716e4c918c6902b10f9591d4b}{\index{variator\-\_\-random.\-c@{variator\-\_\-random.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator}!variator_random.c@{variator\-\_\-random.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Free\-Random\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{variator__random_8c_ac95d9e0716e4c918c6902b10f9591d4b}
+Frees any resources associated with the variator. \hypertarget{variator__random_8c_a479aceb74b5355c1d22856fc7efce890}{\index{variator\-\_\-random.\-c@{variator\-\_\-random.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation}!variator_random.c@{variator\-\_\-random.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Random\-Variation (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{variator__random_8c_a479aceb74b5355c1d22856fc7efce890}
+Generates a new random variation.
+
+\begin{DoxyReturn}{Returns}
+The arguments string representing the random variation on success, and N\-U\-L\-L on failure. The pointer returned should not be freed.
+\end{DoxyReturn}
+\hypertarget{variator__random_8c_a807486069b7180c3b3bf8af4616d055f}{\index{variator\-\_\-random.\-c@{variator\-\_\-random.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator}!variator_random.c@{variator\-\_\-random.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Init\-Random\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Random\-Variator} $\ast$}]{variator, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config, }
+\item[{Uint64}]{seed}
+\end{DoxyParamCaption}
+)}}\label{variator__random_8c_a807486069b7180c3b3bf8af4616d055f}
+Initializes the variator.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/variators_8c.tex b/visualtest/docs/latex/variators_8c.tex
new file mode 100755
index 000000000..a2bef60d4
--- /dev/null
+++ b/visualtest/docs/latex/variators_8c.tex
@@ -0,0 +1,54 @@
+\hypertarget{variators_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variators.c File Reference}
+\label{variators_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variators.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/variators.\-c}}
+}
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-variators.\-h\char`\"{}}\\*
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{variators_8c_ac1d82ee387a19743e47a82c87d3fb7f4}{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator} (\hyperlink{struct_s_d_l_visual_test___variator}{S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$variator, \hyperlink{struct_s_d_l_visual_test___s_u_t_config}{S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$config, \hyperlink{_s_d_l__visualtest__variator__common_8h_a04bfc880abe6940d69a63c06a33acdbd}{S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type} type, Uint64 seed)
+\item
+char $\ast$ \hyperlink{variators_8c_aebdd4c3c545b0063d16929fd56f1a79f}{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation} (\hyperlink{struct_s_d_l_visual_test___variator}{S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$variator)
+\item
+void \hyperlink{variators_8c_a98727ef649135c3312056d7603cb70b5}{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator} (\hyperlink{struct_s_d_l_visual_test___variator}{S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$variator)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Source file for the operations that act on variators.
+
+\subsection{Function Documentation}
+\hypertarget{variators_8c_a98727ef649135c3312056d7603cb70b5}{\index{variators.\-c@{variators.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator}!variators.c@{variators.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}void S\-D\-L\-Visual\-Test\-\_\-\-Free\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{variators_8c_a98727ef649135c3312056d7603cb70b5}
+Frees any resources associated with the variator. \hypertarget{variators_8c_aebdd4c3c545b0063d16929fd56f1a79f}{\index{variators.\-c@{variators.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation@{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation}!variators.c@{variators.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ S\-D\-L\-Visual\-Test\-\_\-\-Get\-Next\-Variation (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$}]{variator}
+\end{DoxyParamCaption}
+)}}\label{variators_8c_aebdd4c3c545b0063d16929fd56f1a79f}
+Gets the next variation using the variator.
+
+\begin{DoxyReturn}{Returns}
+The arguments string representing the variation on success, and N\-U\-L\-L on failure. The pointer returned should not be freed.
+\end{DoxyReturn}
+\hypertarget{variators_8c_ac1d82ee387a19743e47a82c87d3fb7f4}{\index{variators.\-c@{variators.\-c}!S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator}}
+\index{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator@{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator}!variators.c@{variators.\-c}}
+\subsubsection[{S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator}]{\setlength{\rightskip}{0pt plus 5cm}int S\-D\-L\-Visual\-Test\-\_\-\-Init\-Variator (
+\begin{DoxyParamCaption}
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator} $\ast$}]{variator, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-S\-U\-T\-Config} $\ast$}]{config, }
+\item[{{\bf S\-D\-L\-Visual\-Test\-\_\-\-Variator\-Type}}]{type, }
+\item[{Uint64}]{seed}
+\end{DoxyParamCaption}
+)}}\label{variators_8c_ac1d82ee387a19743e47a82c87d3fb7f4}
+Initializes the variator object pointed to by {\ttfamily variator} of type {\ttfamily type} with information from the config object pointed to by {\ttfamily config}.
+
+\begin{DoxyReturn}{Returns}
+1 on success, 0 on failure
+\end{DoxyReturn}
diff --git a/visualtest/docs/latex/windows__process_8c.tex b/visualtest/docs/latex/windows__process_8c.tex
new file mode 100755
index 000000000..f04229548
--- /dev/null
+++ b/visualtest/docs/latex/windows__process_8c.tex
@@ -0,0 +1,12 @@
+\hypertarget{windows__process_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows/windows\-\_\-process.c File Reference}
+\label{windows__process_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows/windows\-\_\-process.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows/windows\-\_\-process.\-c}}
+}
+{\ttfamily \#include $<$S\-D\-L.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+{\ttfamily \#include $<$string.\-h$>$}\\*
+{\ttfamily \#include $<$stdlib.\-h$>$}\\*
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-process.\-h\char`\"{}}\\*
+
+
+\subsection{Detailed Description}
+Source file for the process A\-P\-I on windows.
\ No newline at end of file
diff --git a/visualtest/docs/latex/windows__screenshot_8c.tex b/visualtest/docs/latex/windows__screenshot_8c.tex
new file mode 100755
index 000000000..b84a39ed1
--- /dev/null
+++ b/visualtest/docs/latex/windows__screenshot_8c.tex
@@ -0,0 +1,10 @@
+\hypertarget{windows__screenshot_8c}{\section{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows/windows\-\_\-screenshot.c File Reference}
+\label{windows__screenshot_8c}\index{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows/windows\-\_\-screenshot.\-c@{C\-:/\-Users/\-D\-E\-L\-L/\-Work/sdlvisualtest/visualtest/src/windows/windows\-\_\-screenshot.\-c}}
+}
+{\ttfamily \#include \char`\"{}S\-D\-L\-\_\-visualtest\-\_\-process.\-h\char`\"{}}\\*
+{\ttfamily \#include $<$S\-D\-L.\-h$>$}\\*
+{\ttfamily \#include $<$S\-D\-L\-\_\-test.\-h$>$}\\*
+
+
+\subsection{Detailed Description}
+Source file for the screenshot A\-P\-I on windows.
\ No newline at end of file
diff --git a/visualtest/include/SDL_visualtest_action_configparser.h b/visualtest/include/SDL_visualtest_action_configparser.h
new file mode 100755
index 000000000..856f81968
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_action_configparser.h
@@ -0,0 +1,147 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file SDL_visualtest_action_configparser.h
+ *
+ * Header file for the parser for action config files.
+ */
+
+#ifndef _SDL_visualtest_action_configparser_h
+#define _SDL_visualtest_action_configparser_h
+
+/** The maximum length of one line in the actions file */
+#define MAX_ACTION_LINE_LENGTH 300
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Type of the action.
+ */
+typedef enum
+{
+ /*! Launch an application with some given arguments */
+ SDL_ACTION_LAUNCH = 0,
+ /*! Kill the SUT process */
+ SDL_ACTION_KILL,
+ /*! Quit (Gracefully exit) the SUT process */
+ SDL_ACTION_QUIT,
+ /*! Take a screenshot of the SUT window */
+ SDL_ACTION_SCREENSHOT,
+ /*! Verify a previously taken screenshot */
+ SDL_ACTION_VERIFY
+} SDLVisualTest_ActionType;
+
+/**
+ * Struct that defines an action that will be performed on the SUT process at
+ * a specific time.
+ */
+typedef struct SDLVisualTest_Action
+{
+ /*! The type of action to be performed */
+ SDLVisualTest_ActionType type;
+ /*! The time, in milliseconds from the launch of the SUT, when the action
+ will be performed */
+ int time;
+ /*! Any additional information needed to perform the action. */
+ union
+ {
+ /*! The path and arguments to the process to be launched */
+ struct
+ {
+ char* path;
+ char* args;
+ } process;
+ } extra;
+} SDLVisualTest_Action;
+
+/**
+ * Struct for a node in the action queue.
+ */
+typedef struct SDLVisualTest_ActionNode
+{
+ /*! The action in this node */
+ SDLVisualTest_Action action;
+ /*! Pointer to the next element in the queue */
+ struct SDLVisualTest_ActionNode* next;
+} SDLVisualTest_ActionNode;
+
+/**
+ * Queue structure for actions loaded from the actions config file.
+ */
+typedef struct SDLVisualTest_ActionQueue
+{
+ /*! Pointer to the front of the queue */
+ SDLVisualTest_ActionNode* front;
+ /*! Pointer to the rear of the queue */
+ SDLVisualTest_ActionNode* rear;
+ /*! Number of nodes in the queue */
+ int size;
+} SDLVisualTest_ActionQueue;
+
+/**
+ * Add an action pointed to by \c action to the rear of the action queue pointed
+ * to by \c queue.
+ *
+ * \return 1 on success, 0 on failure.
+ */
+int SDLVisualTest_EnqueueAction(SDLVisualTest_ActionQueue* queue,
+ SDLVisualTest_Action action);
+
+/**
+ * Remove an action from the front of the action queue pointed to by \c queue.
+ *
+ * \return 1 on success, 0 on failure.
+ */
+int SDLVisualTest_DequeueAction(SDLVisualTest_ActionQueue* queue);
+
+/**
+ * Initialize the action queue pointed to by \c queue.
+ */
+void SDLVisualTest_InitActionQueue(SDLVisualTest_ActionQueue* queue);
+
+/**
+ * Get the action at the front of the action queue pointed to by \c queue.
+ * The returned action pointer may become invalid after subsequent dequeues.
+ *
+ * \return pointer to the action on success, NULL on failure.
+ */
+SDLVisualTest_Action* SDLVisualTest_GetQueueFront(SDLVisualTest_ActionQueue* queue);
+
+/**
+ * Check if the queue pointed to by \c queue is empty or not.
+ *
+ * \return 1 if the queue is empty, 0 otherwise.
+ */
+int SDLVisualTest_IsActionQueueEmpty(SDLVisualTest_ActionQueue* queue);
+
+/**
+ * Dequeues all the elements in the queque pointed to by \c queue.
+ */
+void SDLVisualTest_EmptyActionQueue(SDLVisualTest_ActionQueue* queue);
+
+/**
+ * Inserts an action \c action into the queue pointed to by \c queue such that
+ * the times of actions in the queue increase as we move from the front to the
+ * rear.
+ *
+ * \return 1 on success, 0 on failure.
+ */
+int SDLVisualTest_InsertIntoActionQueue(SDLVisualTest_ActionQueue* queue,
+ SDLVisualTest_Action action);
+
+/**
+ * Parses an action config file with path \c file and populates an action queue
+ * pointed to by \c queue with actions.
+ *
+ * \return 1 on success, 0 on failure.
+ */
+int SDLVisualTest_ParseActionConfig(char* file, SDLVisualTest_ActionQueue* queue);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_action_configparser_h */
\ No newline at end of file
diff --git a/visualtest/include/SDL_visualtest_exhaustive_variator.h b/visualtest/include/SDL_visualtest_exhaustive_variator.h
new file mode 100755
index 000000000..f8f7bc332
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_exhaustive_variator.h
@@ -0,0 +1,62 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file SDL_visualtest_exhaustive_variator.h
+ *
+ * Header for the exhaustive variator.
+ */
+
+#include "SDL_visualtest_harness_argparser.h"
+#include "SDL_visualtest_variator_common.h"
+
+#ifndef _SDL_visualtest_exhaustive_variator_h
+#define _SDL_visualtest_exhaustive_variator_h
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Struct for the variator that exhaustively iterates through all variations of
+ * command line arguments to the SUT.
+ */
+typedef struct SDLVisualTest_ExhaustiveVariator
+{
+ /*! The current variation. */
+ SDLVisualTest_Variation variation;
+ /*! Configuration object for the SUT that the variator is running for. */
+ SDLVisualTest_SUTConfig config;
+ /*! Buffer to store the arguments string built from the variation */
+ char buffer[MAX_SUT_ARGS_LEN];
+} SDLVisualTest_ExhaustiveVariator;
+
+/**
+ * Initializes the variator.
+ *
+ * \return 1 on success, 0 on failure
+ */
+int SDLVisualTest_InitExhaustiveVariator(SDLVisualTest_ExhaustiveVariator* variator,
+ SDLVisualTest_SUTConfig* config);
+
+/**
+ * Gets the arguments string for the next variation using the variator and updates
+ * the variator's current variation object to the next variation.
+ *
+ * \return The arguments string representing the next variation on success, and
+ * NULL on failure or if we have iterated through all possible variations.
+ * In the latter case subsequent calls will start the variations again from
+ * the very beginning. The pointer returned should not be freed.
+ */
+char* SDLVisualTest_GetNextExhaustiveVariation(SDLVisualTest_ExhaustiveVariator* variator);
+
+/**
+ * Frees any resources associated with the variator.
+ */
+void SDLVisualTest_FreeExhaustiveVariator(SDLVisualTest_ExhaustiveVariator* variator);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_exhaustive_variator_h */
\ No newline at end of file
diff --git a/visualtest/include/SDL_visualtest_harness_argparser.h b/visualtest/include/SDL_visualtest_harness_argparser.h
new file mode 100755
index 000000000..b5fac7eb3
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_harness_argparser.h
@@ -0,0 +1,73 @@
+/**
+ * \file SDL_visualtest_harness_argparser.h
+ *
+ * Provides functionality to parse command line arguments to the test harness.
+ */
+
+#include
+#include "SDL_visualtest_sut_configparser.h"
+#include "SDL_visualtest_variator_common.h"
+#include "SDL_visualtest_action_configparser.h"
+
+#ifndef _SDL_visualtest_harness_argparser_h
+#define _SDL_visualtest_harness_argparser_h
+
+/** Maximum length of a path string */
+#define MAX_PATH_LEN 300
+/** Maximum length of a string of SUT arguments */
+#define MAX_SUT_ARGS_LEN 600
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Stores the state of the test harness.
+ */
+typedef struct SDLVisualTest_HarnessState
+{
+ /*! Path to the System Under Test (SUT) executable */
+ char sutapp[MAX_PATH_LEN];
+ /*! Command line arguments to be passed to the SUT */
+ char sutargs[MAX_SUT_ARGS_LEN];
+ /*! Time in milliseconds after which to kill the SUT */
+ int timeout;
+ /*! Configuration object for the SUT */
+ SDLVisualTest_SUTConfig sut_config;
+ /*! What type of variator to use to generate argument strings */
+ SDLVisualTest_VariatorType variator_type;
+ /*! The number of variations to generate */
+ int num_variations;
+ /*! If true, the test harness will just print the different variations
+ without launching the SUT for each one */
+ SDL_bool no_launch;
+ /*! A queue with actions to be performed while the SUT is running */
+ SDLVisualTest_ActionQueue action_queue;
+ /*! Output directory to save the screenshots */
+ char output_dir[MAX_PATH_LEN];
+ /*! Path to directory with the verification images */
+ char verify_dir[MAX_PATH_LEN];
+} SDLVisualTest_HarnessState;
+
+/**
+ * Parse command line paramters to the test harness and populate a state object.
+ *
+ * \param argv The array of command line parameters.
+ * \param state Pointer to the state object to be populated.
+ *
+ * \return Non-zero on success, zero on failure.
+ */
+int SDLVisualTest_ParseHarnessArgs(char** argv, SDLVisualTest_HarnessState* state);
+
+/**
+ * Frees any resources associated with the state object pointed to by \c state.
+ */
+void SDLVisualTest_FreeHarnessState(SDLVisualTest_HarnessState* state);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_harness_argparser_h */
diff --git a/visualtest/include/SDL_visualtest_mischelper.h b/visualtest/include/SDL_visualtest_mischelper.h
new file mode 100755
index 000000000..34323896e
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_mischelper.h
@@ -0,0 +1,26 @@
+/**
+ * \file mischelper.c
+ *
+ * Header with miscellaneous helper functions.
+ */
+
+#ifndef _SDL_visualtest_mischelper_h
+#define _SDL_visualtest_mischelper_h
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Stores a 32 digit hexadecimal string representing the MD5 hash of the
+ * string \c str in \c hash.
+ */
+void SDLVisualTest_HashString(char* str, char hash[33]);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_mischelper_h */
\ No newline at end of file
diff --git a/visualtest/include/SDL_visualtest_parsehelper.h b/visualtest/include/SDL_visualtest_parsehelper.h
new file mode 100755
index 000000000..f0f654c89
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_parsehelper.h
@@ -0,0 +1,44 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file SDL_visualtest_parsehelper.h
+ *
+ * Header with some helper functions for parsing strings.
+ */
+
+#ifndef _SDL_visualtest_parsehelper_h
+#define _SDL_visualtest_parsehelper_h
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Takes an string of command line arguments and breaks them up into an array
+ * based on whitespace.
+ *
+ * \param args The string of arguments.
+ *
+ * \return NULL on failure, an array of strings on success. The last element
+ * of the array is NULL. The first element of the array is NULL and should
+ * be set to the path of the executable by the caller.
+ */
+char** SDLVisualTest_ParseArgsToArgv(char* args);
+
+/**
+ * Takes a string and breaks it into tokens by splitting on whitespace.
+ *
+ * \param str The string to be split.
+ * \param max_token_len Length of each element in the array to be returned.
+ *
+ * \return NULL on failure; an array of strings with the tokens on success. The
+ * last element of the array is NULL.
+ */
+char** SDLVisualTest_Tokenize(char* str, int max_token_len);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_parsehelper_h */
diff --git a/visualtest/include/SDL_visualtest_process.h b/visualtest/include/SDL_visualtest_process.h
new file mode 100755
index 000000000..ea65cbab3
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_process.h
@@ -0,0 +1,111 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file SDL_visualtest_process.h
+ *
+ * Provides cross-platfrom process launching and termination functionality.
+ */
+
+#include
+
+#if defined(__WIN32__)
+#include
+#include
+#elif defined(__LINUX__)
+#include
+#else
+#error "Unsupported platform."
+#endif
+
+#ifndef _SDL_visualtest_process_h
+#define _SDL_visualtest_process_h
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Struct to store a platform specific handle to a process.
+ */
+typedef struct SDL_ProcessInfo
+{
+//#if defined(_WIN32) || defined(__WIN32__)
+#if defined(__WIN32__)
+ PROCESS_INFORMATION pi;
+//#elif defined(__linux__)
+#elif defined(__LINUX__)
+ int pid;
+#endif
+} SDL_ProcessInfo;
+
+/**
+ * This structure stores the exit status (value returned by main()) and
+ * whether the process exited sucessfully or not.
+ */
+typedef struct SDL_ProcessExitStatus
+{
+ int exit_success; /*!< Zero if the process exited successfully */
+ int exit_status; /*!< The exit status of the process. 8-bit value. */
+} SDL_ProcessExitStatus;
+
+/**
+ * Launches a process with the given commandline arguments.
+ *
+ * \param file The path to the executable to be launched.
+ * \param args The command line arguments to be passed to the process.
+ * \param pinfo Pointer to an SDL_ProcessInfo object to be populated with
+ * platform specific information about the launched process.
+ *
+ * \return Non-zero on success, zero on failure.
+ */
+int SDL_LaunchProcess(char* file, char* args, SDL_ProcessInfo* pinfo);
+
+/**
+ * Checks if a process is running or not.
+ *
+ * \param pinfo Pointer to SDL_ProcessInfo object of the process that needs to be
+ * checked.
+ *
+ * \return 1 if the process is still running; zero if it is not and -1 if the
+ * status could not be retrieved.
+ */
+int SDL_IsProcessRunning(SDL_ProcessInfo* pinfo);
+
+/**
+ * Kills a currently running process.
+ *
+ * \param pinfo Pointer to a SDL_ProcessInfo object of the process to be terminated.
+ * \param ps Pointer to a SDL_ProcessExitStatus object which will be populated
+ * with the exit status.
+ *
+ * \return 1 on success, 0 on failure.
+ */
+int SDL_KillProcess(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps);
+
+/**
+ * Cleanly exits the process represented by \c pinfo and stores the exit status
+ * in the exit status object pointed to by \c ps.
+ *
+ * \return 1 on success, 0 on failure.
+ */
+int SDL_QuitProcess(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps);
+
+/**
+ * Gets the exit status of a process. If the exit status is -1, the process is
+ * still running.
+ *
+ * \param pinfo Pointer to a SDL_ProcessInfo object of the process to be checked.
+ * \param ps Pointer to a SDL_ProcessExitStatus object which will be populated
+ * with the exit status.
+ *
+ * \return 1 on success, 0 on failure.
+ */
+int SDL_GetProcessExitStatus(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_process_h */
+
diff --git a/visualtest/include/SDL_visualtest_random_variator.h b/visualtest/include/SDL_visualtest_random_variator.h
new file mode 100755
index 000000000..7ec79f22b
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_random_variator.h
@@ -0,0 +1,59 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file SDL_visualtest_random_variator.h
+ *
+ * Header for the random variator.
+ */
+
+#include "SDL_visualtest_harness_argparser.h"
+#include "SDL_visualtest_variator_common.h"
+
+#ifndef _SDL_visualtest_random_variator_h
+#define _SDL_visualtest_random_variator_h
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Struct for the variator that randomly generates variations of command line
+ * arguments to the SUT.
+ */
+typedef struct SDLVisualTest_RandomVariator
+{
+ /*! The current variation. */
+ SDLVisualTest_Variation variation;
+ /*! Configuration object for the SUT that the variator is running for. */
+ SDLVisualTest_SUTConfig config;
+ /*! Buffer to store the arguments string built from the variation */
+ char buffer[MAX_SUT_ARGS_LEN];
+} SDLVisualTest_RandomVariator;
+
+/**
+ * Initializes the variator.
+ *
+ * \return 1 on success, 0 on failure
+ */
+int SDLVisualTest_InitRandomVariator(SDLVisualTest_RandomVariator* variator,
+ SDLVisualTest_SUTConfig* config, Uint64 seed);
+
+/**
+ * Generates a new random variation.
+ *
+ * \return The arguments string representing the random variation on success, and
+ * NULL on failure. The pointer returned should not be freed.
+ */
+char* SDLVisualTest_GetNextRandomVariation(SDLVisualTest_RandomVariator* variator);
+
+/**
+ * Frees any resources associated with the variator.
+ */
+void SDLVisualTest_FreeRandomVariator(SDLVisualTest_RandomVariator* variator);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_random_variator_h */
\ No newline at end of file
diff --git a/visualtest/include/SDL_visualtest_rwhelper.h b/visualtest/include/SDL_visualtest_rwhelper.h
new file mode 100755
index 000000000..470039e9c
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_rwhelper.h
@@ -0,0 +1,85 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file rwhelper.c
+ *
+ * Header file with some helper functions for working with SDL_RWops.
+ */
+
+#include
+
+#ifndef _SDL_visualtest_rwhelper_h
+#define _SDL_visualtest_rwhelper_h
+
+/** Length of the buffer in SDLVisualTest_RWHelperBuffer */
+#define RWOPS_BUFFER_LEN 256
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Struct that is used as a buffer by the RW helper functions. Should be initialized by calling
+ * SDLVisualTest_RWHelperResetBuffer() before being used.
+ */
+typedef struct SDLVisualTest_RWHelperBuffer
+{
+ /*! Character buffer that data is read into */
+ char buffer[RWOPS_BUFFER_LEN];
+ /*! buffer[buffer_pos] is the next character to be read from the buffer */
+ int buffer_pos;
+ /*! Number of character read into the buffer */
+ int buffer_width;
+} SDLVisualTest_RWHelperBuffer;
+
+/**
+ * Resets the buffer pointed to by \c buffer used by some of the helper functions.
+ * This function should be called when you're using one of the helper functions
+ * with a new SDL_RWops object.
+ */
+void SDLVisualTest_RWHelperResetBuffer(SDLVisualTest_RWHelperBuffer* buffer);
+
+/**
+ * Reads a single character using the SDL_RWops object pointed to by \c rw.
+ * This function reads data in blocks and stores them in the buffer pointed to by
+ * \c buffer, so other SDL_RWops functions should not be used in conjunction
+ * with this function.
+ *
+ * \return The character that was read.
+ */
+char SDLVisualTest_RWHelperReadChar(SDL_RWops* rw,
+ SDLVisualTest_RWHelperBuffer* buffer);
+
+/**
+ * Reads characters using the SDL_RWops object pointed to by \c rw into the
+ * character array pointed to by \c str (of size \c size) until either the
+ * array is full or a new line is encountered. If \c comment_char is encountered,
+ * all characters from that position till the end of the line are ignored. The new line
+ * is not included as part of the buffer. Lines with only whitespace and comments
+ * are ignored. This function reads data in blocks and stores them in the buffer
+ * pointed to by \c buffer, so other SDL_RWops functions should not be used in
+ * conjunction with this function.
+ *
+ * \return pointer to the string on success, NULL on failure or EOF.
+ */
+char* SDLVisualTest_RWHelperReadLine(SDL_RWops* rw, char* str, int size,
+ SDLVisualTest_RWHelperBuffer* buffer,
+ char comment_char);
+
+/**
+ * Counts the number of lines that are not all whitespace and comments using the
+ * SDL_RWops object pointed to by \c rw. \c comment_char indicates the character
+ * used for comments. Uses the buffer pointed to by \c buffer to read data in blocks.
+ *
+ * \return Number of lines on success, -1 on failure.
+ */
+int SDLVisualTest_RWHelperCountNonEmptyLines(SDL_RWops* rw,
+ SDLVisualTest_RWHelperBuffer* buffer,
+ char comment_char);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_rwhelper_h */
\ No newline at end of file
diff --git a/visualtest/include/SDL_visualtest_screenshot.h b/visualtest/include/SDL_visualtest_screenshot.h
new file mode 100755
index 000000000..96e7d2049
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_screenshot.h
@@ -0,0 +1,50 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file SDL_visualtest_screenshot.h
+ *
+ * Header for the screenshot API.
+ */
+
+#include "SDL_visualtest_process.h"
+
+#ifndef _SDL_visualtest_screenshot_h
+#define _SDL_visualtest_screenshot_h
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Takes a screenshot of each window owned by the process \c pinfo and saves
+ * it in a file \c prefix-i.png where \c prefix is the full path to the file
+ * along with a prefix given to each screenshot.
+ *
+ * \return 1 on success, 0 on failure.
+ */
+int SDLVisualTest_ScreenshotProcess(SDL_ProcessInfo* pinfo, char* prefix);
+
+/**
+ * Takes a screenshot of the desktop and saves it into the file with path
+ * \c filename.
+ *
+ * \return 1 on success, 0 on failure.
+ */
+int SDLVisualTest_ScreenshotDesktop(char* filename);
+
+/**
+ * Compare a screenshot taken previously with SUT arguments \c args that is
+ * located in \c test_dir with a verification image that is located in
+ * \c verify_dir.
+ *
+ * \return -1 on failure, 0 if the images were not equal, 1 if the images are equal
+ * and 2 if the verification image is not present.
+ */
+int SDLVisualTest_VerifyScreenshots(char* args, char* test_dir, char* verify_dir);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_screenshot_h */
\ No newline at end of file
diff --git a/visualtest/include/SDL_visualtest_sut_configparser.h b/visualtest/include/SDL_visualtest_sut_configparser.h
new file mode 100755
index 000000000..929615565
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_sut_configparser.h
@@ -0,0 +1,103 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file SDL_visualtest_sut_configparser.h
+ *
+ * Header for the parser for SUT config files.
+ */
+
+#ifndef _SDL_visualtest_sut_configparser_h
+#define _SDL_visualtest_sut_configparser_h
+
+/** Maximum length of the name of an SUT option */
+#define MAX_SUTOPTION_NAME_LEN 100
+/** Maximum length of the name of a category of an SUT option */
+#define MAX_SUTOPTION_CATEGORY_LEN 40
+/** Maximum length of one enum value of an SUT option */
+#define MAX_SUTOPTION_ENUMVAL_LEN 40
+/** Maximum length of a line in the paramters file */
+#define MAX_SUTOPTION_LINE_LENGTH 256
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Describes the different kinds of options to the SUT.
+ */
+typedef enum {
+ SDL_SUT_OPTIONTYPE_STRING = 0,
+ SDL_SUT_OPTIONTYPE_INT,
+ SDL_SUT_OPTIONTYPE_ENUM,
+ SDL_SUT_OPTIONTYPE_BOOL
+} SDLVisualTest_SUTOptionType;
+
+/**
+ * Represents the range of values an integer option can take.
+ */
+typedef struct SDLVisualTest_SUTIntRange {
+ /*! Minimum value of the integer option */
+ int min;
+ /*! Maximum value of the integer option */
+ int max;
+} SDLVisualTest_SUTIntRange;
+
+/**
+ * Struct that defines an option to be passed to the SUT.
+ */
+typedef struct SDLVisualTest_SUTOption {
+ /*! The name of the option. This is what you would pass in the command line
+ along with two leading hyphens. */
+ char name[MAX_SUTOPTION_NAME_LEN];
+ /*! An array of categories that the option belongs to. The last element is
+ NULL. */
+ char** categories;
+ /*! Type of the option - integer, boolean, etc. */
+ SDLVisualTest_SUTOptionType type;
+ /*! Whether the option is required or not */
+ SDL_bool required;
+ /*! extra data that is required for certain types */
+ union {
+ /*! This field is valid only for integer type options; it defines the
+ valid range for such an option */
+ SDLVisualTest_SUTIntRange range;
+ /*! This field is valid only for enum type options; it holds the list of values
+ that the option can take. The last element is NULL */
+ char** enum_values;
+ } data;
+} SDLVisualTest_SUTOption;
+
+/**
+ * Struct to hold all the options to an SUT application.
+ */
+typedef struct SDLVisualTest_SUTConfig
+{
+ /*! Pointer to an array of options */
+ SDLVisualTest_SUTOption* options;
+ /*! Number of options in \c options */
+ int num_options;
+} SDLVisualTest_SUTConfig;
+
+/**
+ * Parses a configuration file that describes the command line options an SUT
+ * application will take and populates a SUT config object. All lines in the
+ * config file must be smaller than
+ *
+ * \param file Path to the configuration file.
+ * \param config Pointer to an object that represents an SUT configuration.
+ *
+ * \return zero on failure, non-zero on success
+ */
+int SDLVisualTest_ParseSUTConfig(char* file, SDLVisualTest_SUTConfig* config);
+
+/**
+ * Free any resources associated with the config object pointed to by \c config.
+ */
+void SDLVisualTest_FreeSUTConfig(SDLVisualTest_SUTConfig* config);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_sut_configparser_h */
diff --git a/visualtest/include/SDL_visualtest_variator_common.h b/visualtest/include/SDL_visualtest_variator_common.h
new file mode 100755
index 000000000..451e81b74
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_variator_common.h
@@ -0,0 +1,120 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file SDL_visualtest_variator_common.h
+ *
+ * Header for common functionality used by variators.
+ */
+
+#include
+#include "SDL_visualtest_sut_configparser.h"
+
+#ifndef _SDL_visualtest_variator_common_h
+#define _SDL_visualtest_variator_common_h
+
+/** The number of variations one integer option would generate */
+#define SDL_SUT_INTEGER_OPTION_TEST_STEPS 3
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** enum for indicating the type of variator being used */
+typedef enum SDLVisualTest_VariatorType
+{
+ SDL_VARIATOR_NONE = 0,
+ SDL_VARIATOR_EXHAUSTIVE,
+ SDL_VARIATOR_RANDOM
+} SDLVisualTest_VariatorType;
+
+/**
+ * One possible value for a command line option to the SUT.
+ */
+typedef union SDLVisualTest_SUTOptionValue
+{
+ /*! Value if the option is of type boolean */
+ SDL_bool bool_value;
+ /*! Value if the option is of type integer. If on is true then the option
+ will be passed to the SUT, otherwise it will be ignored. */
+ struct {
+ int value;
+ SDL_bool on;
+ } integer;
+ /*! Index of the string in the enum_values field of the corresponding
+ SDLVisualTest_SUTOption object. If on is true the option will passed
+ to the SUT, otherwise it will be ignored. */
+ struct {
+ int index;
+ SDL_bool on;
+ } enumerated;
+ /*! Value if the option is of type string. If on is true the option will
+ be passed to the SUT, otherwise it will be ignored. */
+ struct {
+ char* value;
+ SDL_bool on;
+ } string;
+} SDLVisualTest_SUTOptionValue;
+
+/**
+ * Represents a valid combination of parameters that can be passed to the SUT.
+ * The ordering of the values here is the same as the ordering of the options in
+ * the SDLVisualTest_SUTConfig object for this variation.
+ */
+typedef struct SDLVisualTest_Variation
+{
+ /*! Pointer to array of option values */
+ SDLVisualTest_SUTOptionValue* vars;
+ /*! Number of option values in \c vars */
+ int num_vars;
+} SDLVisualTest_Variation;
+
+/**
+ * "Increments" the value of the option by one and returns the carry. We wrap
+ * around to the initial value on overflow which makes the carry one.
+ * For example: "incrementing" an SDL_FALSE option makes it SDL_TRUE with no
+ * carry, and "incrementing" an SDL_TRUE option makes it SDL_FALSE with carry
+ * one. For integers, a random value in the valid range for the option is used.
+ *
+ * \param var Value of the option
+ * \param opt Object with metadata about the option
+ *
+ * \return 1 if there is a carry for enum and bool type options, 0 otherwise.
+ * 1 is always returned for integer and string type options. -1 is
+ * returned on error.
+ */
+int SDLVisualTest_NextValue(SDLVisualTest_SUTOptionValue* var,
+ SDLVisualTest_SUTOption* opt);
+
+/**
+ * Converts a variation object into a string of command line arguments.
+ *
+ * \param variation Variation object to be converted.
+ * \param config Config object for the SUT.
+ * \param buffer Pointer to the buffer the arguments string will be copied into.
+ * \param size Size of the buffer.
+ *
+ * \return 1 on success, 0 on failure
+ */
+int SDLVisualTest_MakeStrFromVariation(SDLVisualTest_Variation* variation,
+ SDLVisualTest_SUTConfig* config,
+ char* buffer, int size);
+
+/**
+ * Initializes the variation using the following rules:
+ * - Boolean options are initialized to SDL_FALSE.
+ * - Integer options are initialized to the minimum valid value they can hold.
+ * - Enum options are initialized to the first element in the list of values they
+ * can take.
+ * - String options are initialized to the name of the option.
+ *
+ * \return 1 on success, 0 on failure.
+ */
+int SDLVisualTest_InitVariation(SDLVisualTest_Variation* variation,
+ SDLVisualTest_SUTConfig* config);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_variator_common_h */
\ No newline at end of file
diff --git a/visualtest/include/SDL_visualtest_variators.h b/visualtest/include/SDL_visualtest_variators.h
new file mode 100755
index 000000000..7aec36bc4
--- /dev/null
+++ b/visualtest/include/SDL_visualtest_variators.h
@@ -0,0 +1,64 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file SDL_visualtest_variators.h
+ *
+ * Header for all the variators that vary input parameters to a SUT application.
+ */
+
+#include "SDL_visualtest_exhaustive_variator.h"
+#include "SDL_visualtest_random_variator.h"
+
+#ifndef _SDL_visualtest_variators_h
+#define _SDL_visualtest_variators_h
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Struct that acts like a wrapper around the different types of variators
+ * available.
+ */
+typedef struct SDLVisualTest_Variator
+{
+ /*! Type of the variator */
+ SDLVisualTest_VariatorType type;
+ /*! union object that stores the variator */
+ union
+ {
+ SDLVisualTest_ExhaustiveVariator exhaustive;
+ SDLVisualTest_RandomVariator random;
+ } data;
+} SDLVisualTest_Variator;
+
+/**
+ * Initializes the variator object pointed to by \c variator of type \c type
+ * with information from the config object pointed to by \c config.
+ *
+ * \return 1 on success, 0 on failure
+ */
+int SDLVisualTest_InitVariator(SDLVisualTest_Variator* variator,
+ SDLVisualTest_SUTConfig* config,
+ SDLVisualTest_VariatorType type,
+ Uint64 seed);
+
+/**
+ * Gets the next variation using the variator.
+ *
+ * \return The arguments string representing the variation on success, and
+ * NULL on failure. The pointer returned should not be freed.
+ */
+char* SDLVisualTest_GetNextVariation(SDLVisualTest_Variator* variator);
+
+/**
+ * Frees any resources associated with the variator.
+ */
+void SDLVisualTest_FreeVariator(SDLVisualTest_Variator* variator);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_visualtest_variators_h */
\ No newline at end of file
diff --git a/visualtest/install-sh b/visualtest/install-sh
new file mode 100755
index 000000000..205f21c6b
--- /dev/null
+++ b/visualtest/install-sh
@@ -0,0 +1 @@
+/usr/share/automake-1.11/install-sh
\ No newline at end of file
diff --git a/visualtest/launch_harness.cmd b/visualtest/launch_harness.cmd
new file mode 100755
index 000000000..93462a9d2
--- /dev/null
+++ b/visualtest/launch_harness.cmd
@@ -0,0 +1,2 @@
+start /wait testharness.exe --config testsprite2_crashtest.config > testrun.log 2>&1
+if %ERRORLEVEL% NEQ 0 echo TEST RUN FAILED (see testrun.log)
\ No newline at end of file
diff --git a/visualtest/launch_harness.sh b/visualtest/launch_harness.sh
new file mode 100755
index 000000000..a2d1471c8
--- /dev/null
+++ b/visualtest/launch_harness.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+./testharness.exe --config testsprite2_crashtest.config > testrun.log 2>&1
+if [ "$?" != "0" ]; then
+ echo TEST RUN FAILED (see testrun.log)
+ # report error code to CI
+fi
\ No newline at end of file
diff --git a/visualtest/missing b/visualtest/missing
new file mode 100755
index 000000000..20bc5b0ed
--- /dev/null
+++ b/visualtest/missing
@@ -0,0 +1 @@
+/usr/share/automake-1.11/missing
\ No newline at end of file
diff --git a/visualtest/src/action_configparser.c b/visualtest/src/action_configparser.c
new file mode 100755
index 000000000..bab7fc13e
--- /dev/null
+++ b/visualtest/src/action_configparser.c
@@ -0,0 +1,396 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file action_configparser.c
+ *
+ * Source file for the parser for action config files.
+ */
+
+#include
+#include
+#include
+#include "SDL_visualtest_action_configparser.h"
+#include "SDL_visualtest_rwhelper.h"
+#include "SDL_visualtest_parsehelper.h"
+
+static void
+FreeAction(SDLVisualTest_Action* action)
+{
+ if(!action)
+ return;
+ switch(action->type)
+ {
+ case SDL_ACTION_LAUNCH:
+ {
+ char* path;
+ char* args;
+
+ path = action->extra.process.path;
+ args = action->extra.process.args;
+
+ if(path)
+ SDL_free(path);
+ if(args)
+ SDL_free(args);
+
+ action->extra.process.path = NULL;
+ action->extra.process.args = NULL;
+ }
+ break;
+ }
+}
+
+int
+SDLVisualTest_EnqueueAction(SDLVisualTest_ActionQueue* queue,
+ SDLVisualTest_Action action)
+{
+ SDLVisualTest_ActionNode* node;
+ if(!queue)
+ {
+ SDLTest_LogError("queue argument cannot be NULL");
+ return 0;
+ }
+
+ node = (SDLVisualTest_ActionNode*)SDL_malloc(
+ sizeof(SDLVisualTest_ActionNode));
+ if(!node)
+ {
+ SDLTest_LogError("malloc() failed");
+ return 0;
+ }
+ node->action = action;
+ node->next = NULL;
+ queue->size++;
+ if(!queue->rear)
+ queue->rear = queue->front = node;
+ else
+ {
+ queue->rear->next = node;
+ queue->rear = node;
+ }
+ return 1;
+}
+
+int
+SDLVisualTest_DequeueAction(SDLVisualTest_ActionQueue* queue)
+{
+ SDLVisualTest_ActionNode* node;
+ if(!queue)
+ {
+ SDLTest_LogError("queue argument cannot be NULL");
+ return 0;
+ }
+ if(SDLVisualTest_IsActionQueueEmpty(queue))
+ {
+ SDLTest_LogError("cannot dequeue from empty queue");
+ return 0;
+ }
+ if(queue->front == queue->rear)
+ {
+ FreeAction(&queue->front->action);
+ SDL_free(queue->front);
+ queue->front = queue->rear = NULL;
+ }
+ else
+ {
+ node = queue->front;
+ queue->front = queue->front->next;
+ FreeAction(&node->action);
+ SDL_free(node);
+ }
+ queue->size--;
+ return 1;
+}
+
+void
+SDLVisualTest_InitActionQueue(SDLVisualTest_ActionQueue* queue)
+{
+ if(!queue)
+ {
+ SDLTest_LogError("queue argument cannot be NULL");
+ return;
+ }
+ queue->front = NULL;
+ queue->rear = NULL;
+ queue->size = 0;
+}
+
+SDLVisualTest_Action*
+SDLVisualTest_GetQueueFront(SDLVisualTest_ActionQueue* queue)
+{
+ if(!queue)
+ {
+ SDLTest_LogError("queue argument cannot be NULL");
+ return NULL;
+ }
+ if(!queue->front)
+ {
+ SDLTest_LogError("cannot get front of empty queue");
+ return NULL;
+ }
+
+ return &queue->front->action;
+}
+
+int
+SDLVisualTest_IsActionQueueEmpty(SDLVisualTest_ActionQueue* queue)
+{
+ if(!queue)
+ {
+ SDLTest_LogError("queue argument cannot be NULL");
+ return 1;
+ }
+
+ if(queue->size > 0)
+ return 0;
+ return 1;
+}
+
+void
+SDLVisualTest_EmptyActionQueue(SDLVisualTest_ActionQueue* queue)
+{
+ if(queue)
+ {
+ while(!SDLVisualTest_IsActionQueueEmpty(queue))
+ SDLVisualTest_DequeueAction(queue);
+ }
+}
+
+/* Since the size of the queue is not likely to be larger than 100 elements
+ we can get away with using insertion sort. */
+static void
+SortQueue(SDLVisualTest_ActionQueue* queue)
+{
+ SDLVisualTest_ActionNode* head;
+ SDLVisualTest_ActionNode* tail;
+
+ if(!queue || SDLVisualTest_IsActionQueueEmpty(queue))
+ return;
+
+ head = queue->front;
+ for(tail = head; tail && tail->next;)
+ {
+ SDLVisualTest_ActionNode* pos;
+ SDLVisualTest_ActionNode* element = tail->next;
+
+ if(element->action.time < head->action.time)
+ {
+ tail->next = tail->next->next;
+ element->next = head;
+ head = element;
+ }
+ else if(element->action.time >= tail->action.time)
+ {
+ tail = tail->next;
+ }
+ else
+ {
+ for(pos = head;
+ (pos->next->action.time < element->action.time);
+ pos = pos->next);
+ tail->next = tail->next->next;
+ element->next = pos->next;
+ pos->next = element;
+ }
+ }
+
+ queue->front = head;
+ queue->rear = tail;
+}
+
+int
+SDLVisualTest_InsertIntoActionQueue(SDLVisualTest_ActionQueue* queue,
+ SDLVisualTest_Action action)
+{
+ SDLVisualTest_ActionNode* n;
+ SDLVisualTest_ActionNode* prev;
+ SDLVisualTest_ActionNode* newnode;
+ if(!queue)
+ {
+ SDLTest_LogError("queue argument cannot be NULL");
+ return 0;
+ }
+
+ if(SDLVisualTest_IsActionQueueEmpty(queue))
+ {
+ if(!SDLVisualTest_EnqueueAction(queue, action))
+ {
+ SDLTest_LogError("SDLVisualTest_EnqueueAction() failed");
+ return 0;
+ }
+ return 1;
+ }
+
+ newnode = (SDLVisualTest_ActionNode*)malloc(sizeof(SDLVisualTest_ActionNode));
+ if(!newnode)
+ {
+ SDLTest_LogError("malloc() failed");
+ return 0;
+ }
+ newnode->action = action;
+
+ queue->size++;
+ for(n = queue->front, prev = NULL; n; n = n->next)
+ {
+ if(action.time < n->action.time)
+ {
+ if(prev)
+ {
+ prev->next = newnode;
+ newnode->next = n;
+ }
+ else
+ {
+ newnode->next = queue->front;
+ queue->front = newnode;
+ }
+ return 1;
+ }
+ prev = n;
+ }
+
+ queue->rear->next = newnode;
+ newnode->next = NULL;
+ queue->rear = newnode;
+
+ return 1;
+}
+
+int
+SDLVisualTest_ParseActionConfig(char* file, SDLVisualTest_ActionQueue* queue)
+{
+ char line[MAX_ACTION_LINE_LENGTH];
+ SDLVisualTest_RWHelperBuffer buffer;
+ char* token_ptr;
+ int linenum;
+ SDL_RWops* rw;
+
+ if(!file)
+ {
+ SDLTest_LogError("file argument cannot be NULL");
+ return 0;
+ }
+ if(!queue)
+ {
+ SDLTest_LogError("queue argument cannot be NULL");
+ return 0;
+ }
+
+ rw = SDL_RWFromFile(file, "r");
+ if(!rw)
+ {
+ SDLTest_LogError("SDL_RWFromFile() failed");
+ return 0;
+ }
+
+ SDLVisualTest_RWHelperResetBuffer(&buffer);
+ SDLVisualTest_InitActionQueue(queue);
+ linenum = 0;
+ while(SDLVisualTest_RWHelperReadLine(rw, line, MAX_ACTION_LINE_LENGTH,
+ &buffer, '#'))
+ {
+ SDLVisualTest_Action action;
+ int hr, min, sec;
+
+ /* parse time */
+ token_ptr = strtok(line, " ");
+ if(!token_ptr ||
+ (SDL_sscanf(token_ptr, "%d:%d:%d", &hr, &min, &sec) != 3))
+ {
+ SDLTest_LogError("Could not parse time token at line: %d",
+ linenum);
+ SDLVisualTest_EmptyActionQueue(queue);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ action.time = (((hr * 60 + min) * 60) + sec) * 1000;
+
+ /* parse type */
+ token_ptr = strtok(NULL, " ");
+ if(SDL_strcasecmp(token_ptr, "launch") == 0)
+ action.type = SDL_ACTION_LAUNCH;
+ else if(SDL_strcasecmp(token_ptr, "kill") == 0)
+ action.type = SDL_ACTION_KILL;
+ else if(SDL_strcasecmp(token_ptr, "quit") == 0)
+ action.type = SDL_ACTION_QUIT;
+ else if(SDL_strcasecmp(token_ptr, "screenshot") == 0)
+ action.type = SDL_ACTION_SCREENSHOT;
+ else if(SDL_strcasecmp(token_ptr, "verify") == 0)
+ action.type = SDL_ACTION_VERIFY;
+ else
+ {
+ SDLTest_LogError("Could not parse type token at line: %d",
+ linenum);
+ SDLVisualTest_EmptyActionQueue(queue);
+ SDL_RWclose(rw);
+ return 0;
+ }
+
+ /* parse the extra field */
+ if(action.type == SDL_ACTION_LAUNCH)
+ {
+ int len;
+ char* args;
+ char* path;
+ token_ptr = strtok(NULL, " ");
+ len = token_ptr ? SDL_strlen(token_ptr) : 0;
+ if(len <= 0)
+ {
+ SDLTest_LogError("Please specify the process to launch at line: %d",
+ linenum);
+ SDLVisualTest_EmptyActionQueue(queue);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ path = (char*)SDL_malloc(sizeof(char) * (len + 1));
+ if(!path)
+ {
+ SDLTest_LogError("malloc() failed");
+ SDLVisualTest_EmptyActionQueue(queue);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ SDL_strlcpy(path, token_ptr, len + 1);
+
+ token_ptr = strtok(NULL, "");
+ len = token_ptr ? SDL_strlen(token_ptr) : 0;
+ if(len > 0)
+ {
+ args = (char*)SDL_malloc(sizeof(char) * (len + 1));
+ if(!args)
+ {
+ SDLTest_LogError("malloc() failed");
+ SDL_free(path);
+ SDLVisualTest_EmptyActionQueue(queue);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ SDL_strlcpy(args, token_ptr, len + 1);
+ }
+ else
+ args = NULL;
+
+ action.extra.process.path = path;
+ action.extra.process.args = args;
+ }
+
+ /* add the action to the queue */
+ if(!SDLVisualTest_EnqueueAction(queue, action))
+ {
+ SDLTest_LogError("SDLVisualTest_EnqueueAction() failed");
+ if(action.type == SDL_ACTION_LAUNCH)
+ {
+ SDL_free(action.extra.process.path);
+ if(action.extra.process.args)
+ SDL_free(action.extra.process.args);
+ }
+ SDLVisualTest_EmptyActionQueue(queue);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ }
+ /* sort the queue of actions */
+ SortQueue(queue);
+
+ SDL_RWclose(rw);
+ return 1;
+}
\ No newline at end of file
diff --git a/visualtest/src/harness_argparser.c b/visualtest/src/harness_argparser.c
new file mode 100755
index 000000000..93cf614a3
--- /dev/null
+++ b/visualtest/src/harness_argparser.c
@@ -0,0 +1,358 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file harness_argparser.c
+ *
+ * Source file for functions to parse arguments to the test harness.
+ */
+
+#include
+#include
+#include
+
+#include "SDL_visualtest_harness_argparser.h"
+#include "SDL_visualtest_rwhelper.h"
+
+/** Maximum length of one line in the config file */
+#define MAX_CONFIG_LINE_LEN 400
+/** Default value for the timeout after which the SUT is forcefully killed */
+#define DEFAULT_SUT_TIMEOUT (60 * 1000)
+
+/* String compare s1 and s2 ignoring leading hyphens */
+static int
+StrCaseCmpIgnoreHyphen(char* s1, char* s2)
+{
+ /* treat NULL pointer as empty strings */
+ if(!s1)
+ s1 = "";
+ if(!s2)
+ s2 = "";
+
+ while(*s1 == '-')
+ s1++;
+ while(*s2 == '-')
+ s2++;
+
+ return SDL_strcasecmp(s1, s2);
+}
+
+/* parser an argument, updates the state object and returns the number of
+ arguments processed; returns -1 on failure */
+static int
+ParseArg(char** argv, int index, SDLVisualTest_HarnessState* state)
+{
+ if(!argv || !argv[index] || !state)
+ return 0;
+
+ if(StrCaseCmpIgnoreHyphen("sutapp", argv[index]) == 0)
+ {
+ index++;
+ if(!argv[index])
+ {
+ SDLTest_LogError("Arguments parsing error: Invalid argument for sutapp.");
+ return -1;
+ }
+ SDL_strlcpy(state->sutapp, argv[index], MAX_PATH_LEN);
+ SDLTest_Log("SUT Application: %s", state->sutapp);
+ return 2;
+ }
+ else if(StrCaseCmpIgnoreHyphen("output-dir", argv[index]) == 0)
+ {
+ index++;
+ if(!argv[index])
+ {
+ SDLTest_LogError("Arguments parsing error: Invalid argument for output-dir.");
+ return -1;
+ }
+ SDL_strlcpy(state->output_dir, argv[index], MAX_PATH_LEN);
+ SDLTest_Log("Screenshot Output Directory: %s", state->output_dir);
+ return 2;
+ }
+ else if(StrCaseCmpIgnoreHyphen("verify-dir", argv[index]) == 0)
+ {
+ index++;
+ if(!argv[index])
+ {
+ SDLTest_LogError("Arguments parsing error: Invalid argument for verify-dir.");
+ return -1;
+ }
+ SDL_strlcpy(state->verify_dir, argv[index], MAX_PATH_LEN);
+ SDLTest_Log("Screenshot Verification Directory: %s", state->verify_dir);
+ return 2;
+ }
+ else if(StrCaseCmpIgnoreHyphen("sutargs", argv[index]) == 0)
+ {
+ index++;
+ if(!argv[index])
+ {
+ SDLTest_LogError("Arguments parsing error: Invalid argument for sutargs.");
+ return -1;
+ }
+ SDL_strlcpy(state->sutargs, argv[index], MAX_SUT_ARGS_LEN);
+ SDLTest_Log("SUT Arguments: %s", state->sutargs);
+ return 2;
+ }
+ else if(StrCaseCmpIgnoreHyphen("timeout", argv[index]) == 0)
+ {
+ int hr, min, sec;
+ index++;
+ if(!argv[index] || SDL_sscanf(argv[index], "%d:%d:%d", &hr, &min, &sec) != 3)
+ {
+ SDLTest_LogError("Arguments parsing error: Invalid argument for timeout.");
+ return -1;
+ }
+ state->timeout = (((hr * 60) + min) * 60 + sec) * 1000;
+ SDLTest_Log("Maximum Timeout for each SUT run: %d milliseconds",
+ state->timeout);
+ return 2;
+ }
+ else if(StrCaseCmpIgnoreHyphen("parameter-config", argv[index]) == 0)
+ {
+ index++;
+ if(!argv[index])
+ {
+ SDLTest_LogError("Arguments parsing error: Invalid argument for parameter-config.");
+ return -1;
+ }
+ SDLTest_Log("SUT Parameters file: %s", argv[index]);
+ SDLVisualTest_FreeSUTConfig(&state->sut_config);
+ if(!SDLVisualTest_ParseSUTConfig(argv[index], &state->sut_config))
+ {
+ SDLTest_LogError("Failed to parse SUT parameters file");
+ return -1;
+ }
+ return 2;
+ }
+ else if(StrCaseCmpIgnoreHyphen("variator", argv[index]) == 0)
+ {
+ index++;
+ if(!argv[index])
+ {
+ SDLTest_LogError("Arguments parsing error: Invalid argument for variator.");
+ return -1;
+ }
+ SDLTest_Log("Variator: %s", argv[index]);
+ if(SDL_strcasecmp("exhaustive", argv[index]) == 0)
+ state->variator_type = SDL_VARIATOR_EXHAUSTIVE;
+ else if(SDL_strcasecmp("random", argv[index]) == 0)
+ state->variator_type = SDL_VARIATOR_RANDOM;
+ else
+ {
+ SDLTest_LogError("Arguments parsing error: Invalid variator name.");
+ return -1;
+ }
+ return 2;
+ }
+ else if(StrCaseCmpIgnoreHyphen("num-variations", argv[index]) == 0)
+ {
+ index++;
+ if(!argv[index])
+ {
+ SDLTest_LogError("Arguments parsing error: Invalid argument for num-variations.");
+ return -1;
+ }
+ state->num_variations = SDL_atoi(argv[index]);
+ SDLTest_Log("Number of variations to run: %d", state->num_variations);
+ if(state->num_variations <= 0)
+ {
+ SDLTest_LogError("Arguments parsing error: num-variations must be positive.");
+ return -1;
+ }
+ return 2;
+ }
+ else if(StrCaseCmpIgnoreHyphen("no-launch", argv[index]) == 0)
+ {
+ state->no_launch = SDL_TRUE;
+ SDLTest_Log("SUT will not be launched.");
+ return 1;
+ }
+ else if(StrCaseCmpIgnoreHyphen("action-config", argv[index]) == 0)
+ {
+ index++;
+ if(!argv[index])
+ {
+ SDLTest_LogError("Arguments parsing error: invalid argument for action-config");
+ return -1;
+ }
+ SDLTest_Log("Action Config file: %s", argv[index]);
+ SDLVisualTest_EmptyActionQueue(&state->action_queue);
+ if(!SDLVisualTest_ParseActionConfig(argv[index], &state->action_queue))
+ {
+ SDLTest_LogError("SDLVisualTest_ParseActionConfig() failed");
+ return -1;
+ }
+ return 2;
+ }
+ else if(StrCaseCmpIgnoreHyphen("config", argv[index]) == 0)
+ {
+ index++;
+ if(!argv[index])
+ {
+ SDLTest_LogError("Arguments parsing error: invalid argument for config");
+ return -1;
+ }
+
+ /* do nothing, this option has already been handled */
+ return 2;
+ }
+ return 0;
+}
+
+/* TODO: Trailing/leading spaces and spaces between equals sign not supported. */
+static int
+ParseConfig(char* file, SDLVisualTest_HarnessState* state)
+{
+ SDL_RWops* rw;
+ SDLVisualTest_RWHelperBuffer buffer;
+ char line[MAX_CONFIG_LINE_LEN];
+
+ rw = SDL_RWFromFile(file, "r");
+ if(!rw)
+ {
+ SDLTest_LogError("SDL_RWFromFile() failed");
+ return 0;
+ }
+
+ SDLVisualTest_RWHelperResetBuffer(&buffer);
+ while(SDLVisualTest_RWHelperReadLine(rw, line, MAX_CONFIG_LINE_LEN,
+ &buffer, '#'))
+ {
+ char** argv;
+ int i, num_params;
+
+ /* count number of parameters and replace the trailing newline with 0 */
+ num_params = 1;
+ for(i = 0; line[i]; i++)
+ {
+ if(line[i] == '=')
+ {
+ num_params = 2;
+ break;
+ }
+ }
+
+ /* populate argv */
+ argv = (char**)SDL_malloc((num_params + 1) * sizeof(char*));
+ if(!argv)
+ {
+ SDLTest_LogError("malloc() failed.");
+ SDL_RWclose(rw);
+ return 0;
+ }
+
+ argv[num_params] = NULL;
+ for(i = 0; i < num_params; i++)
+ {
+ argv[i] = strtok(i == 0 ? line : NULL, "=");
+ }
+
+ if(ParseArg(argv, 0, state) == -1)
+ {
+ SDLTest_LogError("ParseArg() failed");
+ SDL_free(argv);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ SDL_free(argv);
+ }
+ SDL_RWclose(rw);
+
+ if(!state->sutapp[0])
+ return 0;
+ return 1;
+}
+
+int
+SDLVisualTest_ParseHarnessArgs(char** argv, SDLVisualTest_HarnessState* state)
+{
+ int i;
+
+ SDLTest_Log("Parsing commandline arguments..");
+
+ if(!argv)
+ {
+ SDLTest_LogError("argv is NULL");
+ return 0;
+ }
+ if(!state)
+ {
+ SDLTest_LogError("state is NULL");
+ return 0;
+ }
+
+ /* initialize the state object */
+ state->sutargs[0] = '\0';
+ state->sutapp[0] = '\0';
+ state->output_dir[0] = '\0';
+ state->verify_dir[0] = '\0';
+ state->timeout = DEFAULT_SUT_TIMEOUT;
+ SDL_memset(&state->sut_config, 0, sizeof(SDLVisualTest_SUTConfig));
+ SDL_memset(&state->action_queue, 0, sizeof(SDLVisualTest_ActionQueue));
+ state->variator_type = SDL_VARIATOR_RANDOM;
+ state->num_variations = -1;
+ state->no_launch = SDL_FALSE;
+
+ /* parse config file if passed */
+ for(i = 0; argv[i]; i++)
+ {
+ if(StrCaseCmpIgnoreHyphen("config", argv[i]) == 0)
+ {
+ if(!argv[i + 1])
+ {
+ SDLTest_Log("Arguments parsing error: invalid argument for config.");
+ return 0;
+ }
+ if(!ParseConfig(argv[i + 1], state))
+ {
+ SDLTest_LogError("ParseConfig() failed");
+ return 0;
+ }
+ }
+ }
+
+ /* parse the arguments */
+ for(i = 0; argv[i];)
+ {
+ int consumed = ParseArg(argv, i, state);
+ if(consumed == -1 || consumed == 0)
+ {
+ SDLTest_LogError("ParseArg() failed");
+ return 0;
+ }
+ i += consumed;
+ }
+
+ if(state->variator_type == SDL_VARIATOR_RANDOM && state->num_variations == -1)
+ state->num_variations = 1;
+
+ /* check to see if required options have been passed */
+ if(!state->sutapp[0])
+ {
+ SDLTest_LogError("sutapp must be passed.");
+ return 0;
+ }
+ if(!state->sutargs[0] && !state->sut_config.options)
+ {
+ SDLTest_LogError("Either sutargs or parameter-config must be passed.");
+ return 0;
+ }
+ if(!state->output_dir[0])
+ {
+ SDL_strlcpy(state->output_dir, "./output", MAX_PATH_LEN);
+ }
+ if(!state->verify_dir[0])
+ {
+ SDL_strlcpy(state->verify_dir, "./verify", MAX_PATH_LEN);
+ }
+
+ return 1;
+}
+
+void
+SDLVisualTest_FreeHarnessState(SDLVisualTest_HarnessState* state)
+{
+ if(state)
+ {
+ SDLVisualTest_EmptyActionQueue(&state->action_queue);
+ SDLVisualTest_FreeSUTConfig(&state->sut_config);
+ }
+}
\ No newline at end of file
diff --git a/visualtest/src/linux/linux_process.c b/visualtest/src/linux/linux_process.c
new file mode 100755
index 000000000..27765c562
--- /dev/null
+++ b/visualtest/src/linux/linux_process.c
@@ -0,0 +1,199 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file linux_process.c
+ *
+ * Source file for the process API on linux.
+ */
+
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "SDL_visualtest_process.h"
+#include "SDL_visualtest_harness_argparser.h"
+#include "SDL_visualtest_parsehelper.h"
+
+#if defined(__LINUX__)
+
+static void
+LogLastError(char* str)
+{
+ char* error = (char*)strerror(errno);
+ if(!str || !error)
+ return;
+ SDLTest_LogError("%s: %s", str, error);
+}
+
+int
+SDL_LaunchProcess(char* file, char* args, SDL_ProcessInfo* pinfo)
+{
+ pid_t pid;
+ char** argv;
+
+ if(!file)
+ {
+ SDLTest_LogError("file argument cannot be NULL");
+ return 0;
+ }
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo cannot be NULL");
+ return 0;
+ }
+ pid = fork();
+ if(pid == -1)
+ {
+ LogLastError("fork() failed");
+ return 0;
+ }
+ else if(pid == 0)
+ {
+ /* parse the arguments string */
+ argv = SDLVisualTest_ParseArgsToArgv(args);
+ argv[0] = file;
+ execv(file, argv);
+ LogLastError("execv() failed");
+ return 0;
+ }
+ else
+ {
+ pinfo->pid = pid;
+ return 1;
+ }
+
+ /* never executed */
+ return 0;
+}
+
+int
+SDL_GetProcessExitStatus(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps)
+{
+ int success, status;
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo argument cannot be NULL");
+ return 0;
+ }
+ if(!ps)
+ {
+ SDLTest_LogError("ps argument cannot be NULL");
+ return 0;
+ }
+ success = waitpid(pinfo->pid, &status, WNOHANG);
+ if(success == -1)
+ {
+ LogLastError("waitpid() failed");
+ return 0;
+ }
+ else if(success == 0)
+ {
+ ps->exit_status = -1;
+ ps->exit_success = 1;
+ }
+ else
+ {
+ ps->exit_success = WIFEXITED(status);
+ ps->exit_status = WEXITSTATUS(status);
+ }
+ return 1;
+}
+
+int
+SDL_IsProcessRunning(SDL_ProcessInfo* pinfo)
+{
+ int success;
+
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo cannot be NULL");
+ return -1;
+ }
+
+ success = kill(pinfo->pid, 0);
+ if(success == -1)
+ {
+ if(errno == ESRCH) /* process is not running */
+ return 0;
+ else
+ {
+ LogLastError("kill() failed");
+ return -1;
+ }
+ }
+ return 1;
+}
+
+int
+SDL_QuitProcess(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps)
+{
+ int success, status;
+
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo argument cannot be NULL");
+ return 0;
+ }
+ if(!ps)
+ {
+ SDLTest_LogError("ps argument cannot be NULL");
+ return 0;
+ }
+
+ success = kill(pinfo->pid, SIGQUIT);
+ if(success == -1)
+ {
+ LogLastError("kill() failed");
+ return 0;
+ }
+
+ success = waitpid(pinfo->pid, &status, 0);
+ if(success == -1)
+ {
+ LogLastError("waitpid() failed");
+ return 0;
+ }
+
+ ps->exit_success = WIFEXITED(status);
+ ps->exit_status = WEXITSTATUS(status);
+ return 1;
+}
+
+int
+SDL_KillProcess(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps)
+{
+ int success, status;
+
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo argument cannot be NULL");
+ return 0;
+ }
+ if(!ps)
+ {
+ SDLTest_LogError("ps argument cannot be NULL");
+ return 0;
+ }
+
+ success = kill(pinfo->pid, SIGKILL);
+ if(success == -1)
+ {
+ LogLastError("kill() failed");
+ return 0;
+ }
+ success = waitpid(pinfo->pid, &status, 0);
+ if(success == -1)
+ {
+ LogLastError("waitpid() failed");
+ return 0;
+ }
+
+ ps->exit_success = WIFEXITED(status);
+ ps->exit_status = WEXITSTATUS(status);
+ return 1;
+}
+
+#endif
diff --git a/visualtest/src/mischelper.c b/visualtest/src/mischelper.c
new file mode 100755
index 000000000..a61f0c89a
--- /dev/null
+++ b/visualtest/src/mischelper.c
@@ -0,0 +1,28 @@
+/**
+ * \file mischelper.c
+ *
+ * Source file with miscellaneous helper functions.
+ */
+
+#include
+
+void
+SDLVisualTest_HashString(char* str, char hash[33])
+{
+ SDLTest_Md5Context md5c;
+ int i;
+
+ if(!str)
+ {
+ SDLTest_LogError("str argument cannot be NULL");
+ return;
+ }
+
+ SDLTest_Md5Init(&md5c);
+ SDLTest_Md5Update(&md5c, (unsigned char*)str, SDL_strlen(str));
+ SDLTest_Md5Final(&md5c);
+
+ /* convert the md5 hash to an array of hexadecimal digits */
+ for(i = 0; i < 16; i++)
+ SDL_snprintf(hash + 2 * i, 33 - 2 * i, "%02x", (int)md5c.digest[i]);
+}
\ No newline at end of file
diff --git a/visualtest/src/parsehelper.c b/visualtest/src/parsehelper.c
new file mode 100755
index 000000000..7d601179b
--- /dev/null
+++ b/visualtest/src/parsehelper.c
@@ -0,0 +1,231 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file parsehelper.c
+ *
+ * Source file with some helper functions for parsing strings.
+ */
+
+#include
+#include "SDL_visualtest_harness_argparser.h"
+
+/* this function uses a DFA to count the number of tokens in an agruments string.
+ state 0 is taken to be the start and end state. State 1 handles a double quoted
+ argument and state 2 handles unquoted arguments. */
+static int
+CountTokens(char* args)
+{
+ int index, num_tokens;
+ int state; /* current state of the DFA */
+
+ if(!args)
+ return -1;
+
+ index = 0;
+ state = 0;
+ num_tokens = 0;
+ while(args[index])
+ {
+ char ch = args[index];
+ switch(state)
+ {
+ case 0:
+ if(ch == '\"')
+ {
+ state = 1;
+ num_tokens++;
+ }
+ else if(!SDL_isspace(ch))
+ {
+ state = 2;
+ num_tokens++;
+ }
+ break;
+
+ case 1:
+ if(ch == '\"')
+ {
+ state = 0;
+ }
+ break;
+
+ case 2:
+ if(SDL_isspace(ch))
+ {
+ state = 0;
+ }
+ break;
+ }
+ index++;
+ }
+ return num_tokens;
+}
+
+/* - size of tokens is num_tokens + 1
+- uses the same DFA used in CountTokens() to split args into an array of strings */
+static int
+TokenizeHelper(char* str, char** tokens, int num_tokens, int max_token_len)
+{
+ int index, state, done, st_index, token_index;
+
+ if(!str)
+ {
+ SDLTest_LogError("str argument cannot be NULL");
+ return 0;
+ }
+ if(!tokens)
+ {
+ SDLTest_LogError("tokens argument cannot be NULL");
+ return 0;
+ }
+ if(num_tokens <= 0)
+ {
+ SDLTest_LogError("num_tokens argument must be positive");
+ return 0;
+ }
+ if(max_token_len <= 0)
+ {
+ SDLTest_LogError("max_token_len argument must be positive");
+ return 0;
+ }
+
+ /* allocate memory for the tokens */
+ tokens[num_tokens] = NULL;
+ for(index = 0; index < num_tokens; index++)
+ {
+ tokens[index] = (char*)SDL_malloc(max_token_len);
+ if(!tokens[index])
+ {
+ int i;
+ SDLTest_LogError("malloc() failed.");
+ for(i = 0; i < index; i++)
+ SDL_free(tokens[i]);
+ return 0;
+ }
+ tokens[index][0] = '\0';
+ }
+
+ /* copy the tokens into the array */
+ st_index = 0;
+ index = 0;
+ token_index = 0;
+ state = 0;
+ done = 0;
+ while(!done)
+ {
+ char ch = str[index];
+ switch(state)
+ {
+ case 0:
+ if(ch == '\"')
+ {
+ state = 1;
+ st_index = index + 1;
+ }
+ else if(!ch)
+ done = 1;
+ else if(ch && !SDL_isspace(ch))
+ {
+ state = 2;
+ st_index = index;
+ }
+ break;
+
+ case 1:
+ if(ch == '\"')
+ {
+ int i;
+ state = 0;
+ for(i = st_index; i < index; i++)
+ {
+ tokens[token_index][i - st_index] = str[i];
+ }
+ tokens[token_index][i - st_index] = '\0';
+ token_index++;
+ }
+ else if(!ch)
+ {
+ SDLTest_LogError("Parsing Error!");
+ done = 1;
+ }
+ break;
+
+ case 2:
+ if(!ch)
+ done = 1;
+ if(SDL_isspace(ch) || !ch)
+ {
+ int i;
+ state = 0;
+ for(i = st_index; i < index; i++)
+ {
+ tokens[token_index][i - st_index] = str[i];
+ }
+ tokens[token_index][i - st_index] = '\0';
+ token_index++;
+ }
+ break;
+ }
+ index++;
+ }
+ return 1;
+}
+
+char**
+SDLVisualTest_Tokenize(char* str, int max_token_len)
+{
+ int num_tokens;
+ char** tokens;
+
+ if(!str)
+ {
+ SDLTest_LogError("str argument cannot be NULL");
+ return NULL;
+ }
+ if(max_token_len <= 0)
+ {
+ SDLTest_LogError("max_token_len argument must be positive");
+ return NULL;
+ }
+
+ num_tokens = CountTokens(str);
+ if(num_tokens == 0)
+ return NULL;
+
+ tokens = (char**)SDL_malloc(sizeof(char*) * (num_tokens + 1));
+ if(!TokenizeHelper(str, tokens, num_tokens, max_token_len))
+ {
+ SDLTest_LogError("TokenizeHelper() failed");
+ SDL_free(tokens);
+ return NULL;
+ }
+ return tokens;
+}
+
+char**
+SDLVisualTest_ParseArgsToArgv(char* args)
+{
+ char** argv;
+ int num_tokens;
+
+ num_tokens = CountTokens(args);
+ if(num_tokens == 0)
+ return NULL;
+
+ /* allocate space for arguments */
+ argv = (char**)SDL_malloc((num_tokens + 2) * sizeof(char*));
+ if(!argv)
+ {
+ SDLTest_LogError("malloc() failed.");
+ return NULL;
+ }
+
+ /* tokenize */
+ if(!TokenizeHelper(args, argv + 1, num_tokens, MAX_SUT_ARGS_LEN))
+ {
+ SDLTest_LogError("TokenizeHelper() failed");
+ SDL_free(argv);
+ return NULL;
+ }
+ argv[0] = NULL;
+ return argv;
+}
diff --git a/visualtest/src/rwhelper.c b/visualtest/src/rwhelper.c
new file mode 100755
index 000000000..a50254006
--- /dev/null
+++ b/visualtest/src/rwhelper.c
@@ -0,0 +1,131 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file rwhelper.c
+ *
+ * Source file with some helper functions for working with SDL_RWops.
+ */
+
+#include
+#include "SDL_visualtest_sut_configparser.h"
+#include "SDL_visualtest_rwhelper.h"
+
+void
+SDLVisualTest_RWHelperResetBuffer(SDLVisualTest_RWHelperBuffer* buffer)
+{
+ if(!buffer)
+ {
+ SDLTest_LogError("buffer argument cannot be NULL");
+ return;
+ }
+ buffer->buffer_pos = 0;
+ buffer->buffer_width = 0;
+}
+
+char
+SDLVisualTest_RWHelperReadChar(SDL_RWops* rw, SDLVisualTest_RWHelperBuffer* buffer)
+{
+ if(!rw || !buffer)
+ return 0;
+ /* if the buffer has been consumed, we fill it up again */
+ if(buffer->buffer_pos == buffer->buffer_width)
+ {
+ buffer->buffer_width = SDL_RWread(rw, buffer->buffer, 1, RWOPS_BUFFER_LEN);
+ buffer->buffer_pos = 0;
+ if(buffer->buffer_width == 0)
+ return 0;
+ }
+ buffer->buffer_pos++;
+ return buffer->buffer[buffer->buffer_pos - 1];
+}
+
+/* does not include new lines in the buffer and adds a trailing null character */
+char*
+SDLVisualTest_RWHelperReadLine(SDL_RWops* rw, char* str, int size,
+ SDLVisualTest_RWHelperBuffer* buffer,
+ char comment_char)
+{
+ char ch;
+ int current_pos, done;
+ if(!rw)
+ {
+ SDLTest_LogError("rw argument cannot be NULL");
+ return NULL;
+ }
+ if(!str)
+ {
+ SDLTest_LogError("str argument cannot be NULL");
+ return NULL;
+ }
+ if(!buffer)
+ {
+ SDLTest_LogError("buffer argument cannot be NULL");
+ return NULL;
+ }
+ if(size <= 0)
+ {
+ SDLTest_LogError("size argument should be positive");
+ return NULL;
+ }
+
+ done = 0;
+ while(!done)
+ {
+ /* ignore leading whitespace */
+ for(ch = SDLVisualTest_RWHelperReadChar(rw, buffer); ch && SDL_isspace(ch);
+ ch = SDLVisualTest_RWHelperReadChar(rw, buffer));
+
+ for(current_pos = 0;
+ ch && ch != '\n' && ch != '\r' && ch != comment_char;
+ current_pos++)
+ {
+ str[current_pos] = ch;
+ if(current_pos >= size - 2)
+ {
+ current_pos++;
+ break;
+ }
+ ch = SDLVisualTest_RWHelperReadChar(rw, buffer);
+ }
+
+ done = 1;
+ if(ch == comment_char) /* discard all characters until the next line */
+ {
+ do
+ {
+ ch = SDLVisualTest_RWHelperReadChar(rw, buffer);
+ }while(ch && ch != '\n' && ch != '\r');
+
+ if(current_pos == 0)
+ done = 0;
+ }
+ }
+ if(current_pos == 0)
+ return NULL;
+
+ str[current_pos] = '\0';
+ return str;
+}
+
+/* Lines with all whitespace are ignored */
+int
+SDLVisualTest_RWHelperCountNonEmptyLines(SDL_RWops* rw,
+ SDLVisualTest_RWHelperBuffer* buffer,
+ char comment_char)
+{
+ int num_lines = 0;
+ char str[MAX_SUTOPTION_LINE_LENGTH];
+ if(!rw)
+ {
+ SDLTest_LogError("rw argument cannot be NULL");
+ return -1;
+ }
+ if(!buffer)
+ {
+ SDLTest_LogError("buffer argument cannot be NULL");
+ return -1;
+ }
+ while(SDLVisualTest_RWHelperReadLine(rw, str, MAX_SUTOPTION_LINE_LENGTH,
+ buffer, comment_char))
+ num_lines++;
+ return num_lines;
+}
\ No newline at end of file
diff --git a/visualtest/src/screenshot.c b/visualtest/src/screenshot.c
new file mode 100755
index 000000000..7d19c7f88
--- /dev/null
+++ b/visualtest/src/screenshot.c
@@ -0,0 +1,136 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file screenshot.c
+ *
+ * Source file for the screenshot API.
+ */
+
+#include "SDL_visualtest_mischelper.h"
+#include
+
+int
+SDLVisualTest_VerifyScreenshots(char* args, char* test_dir, char* verify_dir)
+{
+ int i, verify_len, return_code, test_len;
+ char hash[33];
+ char* verify_path; /* path to the bmp file used for verification */
+ char* test_path; /* path to the bmp file to be verified */
+ SDL_RWops* rw;
+ SDL_Surface* verifybmp;
+
+ return_code = 1;
+
+ if(!args)
+ {
+ SDLTest_LogError("args argument cannot be NULL");
+ return_code = -1;
+ goto verifyscreenshots_cleanup_generic;
+ }
+ if(!test_dir)
+ {
+ SDLTest_LogError("test_dir argument cannot be NULL");
+ return_code = -1;
+ goto verifyscreenshots_cleanup_generic;
+ }
+ if(!verify_dir)
+ {
+ SDLTest_LogError("verify_dir argument cannot be NULL");
+ return_code = -1;
+ goto verifyscreenshots_cleanup_generic;
+ }
+
+ /* generate the MD5 hash */
+ SDLVisualTest_HashString(args, hash);
+
+ /* find the verification image */
+ /* path_len + hash_len + some number of extra characters */
+ verify_len = SDL_strlen(verify_dir) + 32 + 10;
+ verify_path = (char*)SDL_malloc(verify_len * sizeof(char));
+ if(!verify_path)
+ {
+ SDLTest_LogError("malloc() failed");
+ return_code = -1;
+ goto verifyscreenshots_cleanup_generic;
+ }
+ SDL_snprintf(verify_path, verify_len - 1,
+ "%s/%s.bmp", verify_dir, hash);
+ rw = SDL_RWFromFile(verify_path, "rb");
+ if(!rw)
+ {
+ SDLTest_Log("Verification image does not exist."
+ " Please manually verify that the SUT is working correctly.");
+ return_code = 2;
+ goto verifyscreenshots_cleanup_verifypath;
+ }
+
+ /* load the verification image */
+ verifybmp = SDL_LoadBMP_RW(rw, 1);
+ if(!verifybmp)
+ {
+ SDLTest_LogError("SDL_LoadBMP_RW() failed");
+ return_code = -1;
+ goto verifyscreenshots_cleanup_verifypath;
+ }
+
+ /* load the test images and compare with the verification image */
+ /* path_len + hash_len + some number of extra characters */
+ test_len = SDL_strlen(test_dir) + 32 + 10;
+ test_path = (char*)SDL_malloc(test_len * sizeof(char));
+ if(!test_path)
+ {
+ SDLTest_LogError("malloc() failed");
+ return_code = -1;
+ goto verifyscreenshots_cleanup_verifybmp;
+ }
+
+ for(i = 1; ; i++)
+ {
+ SDL_RWops* testrw;
+ SDL_Surface* testbmp;
+
+ if(i == 1)
+ SDL_snprintf(test_path, test_len - 1, "%s/%s.bmp", test_dir, hash);
+ else
+ SDL_snprintf(test_path, test_len - 1, "%s/%s_%d.bmp", test_dir, hash, i);
+ testrw = SDL_RWFromFile(test_path, "rb");
+
+ /* we keep going until we've iterated through the screenshots each
+ SUT window */
+ if(!testrw)
+ break;
+
+ /* load the test screenshot */
+ testbmp = SDL_LoadBMP_RW(testrw, 1);
+ if(!testbmp)
+ {
+ SDLTest_LogError("SDL_LoadBMP_RW() failed");
+ return_code = -1;
+ goto verifyscreenshots_cleanup_verifybmp;
+ }
+
+ /* compare with the verification image */
+ if(SDLTest_CompareSurfaces(testbmp, verifybmp, 0) != 0)
+ {
+ return_code = 0;
+ SDL_FreeSurface(testbmp);
+ goto verifyscreenshots_cleanup_verifybmp;
+ }
+
+ SDL_FreeSurface(testbmp);
+ }
+
+ if(i == 1)
+ {
+ SDLTest_LogError("No verification images found");
+ return_code = -1;
+ }
+
+verifyscreenshots_cleanup_verifybmp:
+ SDL_FreeSurface(verifybmp);
+
+verifyscreenshots_cleanup_verifypath:
+ SDL_free(verify_path);
+
+verifyscreenshots_cleanup_generic:
+ return return_code;
+}
diff --git a/visualtest/src/sut_configparser.c b/visualtest/src/sut_configparser.c
new file mode 100755
index 000000000..cf18b6208
--- /dev/null
+++ b/visualtest/src/sut_configparser.c
@@ -0,0 +1,232 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file sut_configparser.c
+ *
+ * Source file for the parser for SUT config files.
+ */
+
+#include
+#include
+#include
+#include
+#include "SDL_visualtest_sut_configparser.h"
+#include "SDL_visualtest_parsehelper.h"
+#include "SDL_visualtest_rwhelper.h"
+
+int
+SDLVisualTest_ParseSUTConfig(char* file, SDLVisualTest_SUTConfig* config)
+{
+ char line[MAX_SUTOPTION_LINE_LENGTH];
+ SDLVisualTest_RWHelperBuffer buffer;
+ char* token_ptr;
+ char* token_end;
+ int num_lines, i, token_len;
+ SDL_RWops* rw;
+
+ if(!file)
+ {
+ SDLTest_LogError("file argument cannot be NULL");
+ return 0;
+ }
+ if(!config)
+ {
+ SDLTest_LogError("config argument cannot be NULL");
+ return 0;
+ }
+
+ /* count the number of lines */
+ rw = SDL_RWFromFile(file, "r");
+ if(!rw)
+ {
+ SDLTest_LogError("SDL_RWFromFile() failed");
+ return 0;
+ }
+ SDLVisualTest_RWHelperResetBuffer(&buffer);
+ num_lines = SDLVisualTest_RWHelperCountNonEmptyLines(rw, &buffer, '#');
+ if(num_lines == -1)
+ return 0;
+ else if(num_lines == 0)
+ {
+ config->options = NULL;
+ config->num_options = 0;
+ SDL_RWclose(rw);
+ return 1;
+ }
+
+ /* allocate memory */
+ SDL_RWseek(rw, 0, RW_SEEK_SET);
+ SDLVisualTest_RWHelperResetBuffer(&buffer);
+ config->num_options = num_lines;
+ config->options = (SDLVisualTest_SUTOption*)SDL_malloc(num_lines *
+ sizeof(SDLVisualTest_SUTOption));
+ if(!config->options)
+ {
+ SDLTest_LogError("malloc() failed");
+ SDL_RWclose(rw);
+ return 0;
+ }
+
+ /* actually parse the options */
+ for(i = 0; i < num_lines; i++)
+ {
+ if(!SDLVisualTest_RWHelperReadLine(rw, line, MAX_SUTOPTION_LINE_LENGTH,
+ &buffer, '#'))
+ {
+ SDLTest_LogError("SDLVisualTest_RWHelperReadLine() failed");
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+
+ /* parse name */
+ token_ptr = strtok(line, ", ");
+ if(!token_ptr)
+ {
+ SDLTest_LogError("Could not parse line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ token_len = SDL_strlen(token_ptr) + 1;
+ SDL_strlcpy(config->options[i].name, token_ptr, token_len);
+
+ /* parse type */
+ token_ptr = strtok(NULL, ", ");
+ if(!token_ptr)
+ {
+ SDLTest_LogError("Could not parse line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ if(SDL_strcmp(token_ptr, "string") == 0)
+ config->options[i].type = SDL_SUT_OPTIONTYPE_STRING;
+ else if(SDL_strcmp(token_ptr, "integer") == 0)
+ config->options[i].type = SDL_SUT_OPTIONTYPE_INT;
+ else if(SDL_strcmp(token_ptr, "enum") == 0)
+ config->options[i].type = SDL_SUT_OPTIONTYPE_ENUM;
+ else if(SDL_strcmp(token_ptr, "boolean") == 0)
+ config->options[i].type = SDL_SUT_OPTIONTYPE_BOOL;
+ else
+ {
+ SDLTest_LogError("Could not parse type token at line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+
+ /* parse values */
+ token_ptr = strtok(NULL, "]");
+ if(!token_ptr)
+ {
+ SDLTest_LogError("Could not parse line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ token_ptr = SDL_strchr(token_ptr, '[');
+ if(!token_ptr)
+ {
+ SDLTest_LogError("Could not parse enum token at line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ token_ptr++;
+ if(config->options[i].type == SDL_SUT_OPTIONTYPE_INT)
+ {
+ if(SDL_sscanf(token_ptr, "%d %d", &config->options[i].data.range.min,
+ &config->options[i].data.range.max) != 2)
+ {
+ config->options[i].data.range.min = INT_MIN;
+ config->options[i].data.range.max = INT_MAX;
+ }
+ }
+ else if(config->options[i].type == SDL_SUT_OPTIONTYPE_ENUM)
+ {
+ config->options[i].data.enum_values = SDLVisualTest_Tokenize(token_ptr,
+ MAX_SUTOPTION_ENUMVAL_LEN);
+ if(!config->options[i].data.enum_values)
+ {
+ SDLTest_LogError("Could not parse enum token at line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ }
+
+ /* parse required */
+ token_ptr = strtok(NULL, ", ");
+ if(!token_ptr)
+ {
+ SDLTest_LogError("Could not parse line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+
+ if(SDL_strcmp(token_ptr, "true") == 0)
+ config->options[i].required = SDL_TRUE;
+ else if(SDL_strcmp(token_ptr, "false") == 0)
+ config->options[i].required = SDL_FALSE;
+ else
+ {
+ SDLTest_LogError("Could not parse required token at line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+
+ /* parse categories */
+ token_ptr = strtok(NULL, ",");
+ if(!token_ptr)
+ {
+ SDLTest_LogError("Could not parse line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ token_ptr = SDL_strchr(token_ptr, '[');
+ if(!token_ptr)
+ {
+ SDLTest_LogError("Could not parse enum token at line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ token_ptr++;
+ token_end = SDL_strchr(token_ptr, ']');
+ *token_end = '\0';
+ if(!token_end)
+ {
+ SDLTest_LogError("Could not parse enum token at line %d", i + 1);
+ SDL_free(config->options);
+ SDL_RWclose(rw);
+ return 0;
+ }
+ config->options[i].categories = SDLVisualTest_Tokenize(token_ptr,
+ MAX_SUTOPTION_CATEGORY_LEN);
+ }
+ SDL_RWclose(rw);
+ return 1;
+}
+
+void
+SDLVisualTest_FreeSUTConfig(SDLVisualTest_SUTConfig* config)
+{
+ if(config && config->options)
+ {
+ SDLVisualTest_SUTOption* option;
+ for(option = config->options;
+ option != config->options + config->num_options; option++)
+ {
+ if(option->categories)
+ SDL_free(option->categories);
+ if(option->type == SDL_SUT_OPTIONTYPE_ENUM && option->data.enum_values)
+ SDL_free(option->data.enum_values);
+ }
+ SDL_free(config->options);
+ config->options = NULL;
+ config->num_options = 0;
+ }
+}
diff --git a/visualtest/src/testharness.c b/visualtest/src/testharness.c
new file mode 100755
index 000000000..25e41a611
--- /dev/null
+++ b/visualtest/src/testharness.c
@@ -0,0 +1,533 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file testharness.c
+ *
+ * Source file for the test harness.
+ */
+
+#include
+#include
+#include
+#include
+#include "SDL_visualtest_harness_argparser.h"
+#include "SDL_visualtest_process.h"
+#include "SDL_visualtest_variators.h"
+#include "SDL_visualtest_screenshot.h"
+#include "SDL_visualtest_mischelper.h"
+
+#if defined(__WIN32__) && !defined(__CYGWIN__)
+#include
+#elif defined(__WIN32__) && defined(__CYGWIN__)
+#include
+#elif defined(__LINUX__)
+#include
+#include
+#include
+#else
+#error "Unsupported platform"
+#endif
+
+/** Code for the user event triggered when a new action is to be executed */
+#define ACTION_TIMER_EVENT 0
+/** Code for the user event triggered when the maximum timeout is reached */
+#define KILL_TIMER_EVENT 1
+/** FPS value used for delays in the action loop */
+#define ACTION_LOOP_FPS 10
+
+/** Value returned by RunSUTAndTest() when the test has passed */
+#define TEST_PASSED 1
+/** Value returned by RunSUTAndTest() when the test has failed */
+#define TEST_FAILED 0
+/** Value returned by RunSUTAndTest() on a fatal error */
+#define TEST_ERROR -1
+
+static SDL_ProcessInfo pinfo;
+static SDL_ProcessExitStatus sut_exitstatus;
+static SDLVisualTest_HarnessState state;
+static SDLVisualTest_Variator variator;
+static SDLVisualTest_ActionNode* current; /* the current action being performed */
+static SDL_TimerID action_timer, kill_timer;
+
+/* returns a char* to be passed as the format argument of a printf-style function. */
+static char*
+usage()
+{
+ return "Usage: \n%s --sutapp xyz"
+ " [--sutargs abc | --parameter-config xyz.parameters"
+ " [--variator exhaustive|random]"
+ " [--num-variations N] [--no-launch]] [--timeout hh:mm:ss]"
+ " [--action-config xyz.actions]"
+ " [--output-dir /path/to/output]"
+ " [--verify-dir /path/to/verify]"
+ " or --config app.config";
+}
+
+/* register Ctrl+C handlers */
+#if defined(__LINUX__) || defined(__CYGWIN__)
+static void
+CtrlCHandlerCallback(int signum)
+{
+ SDL_Event event;
+ SDLTest_Log("Ctrl+C received");
+ event.type = SDL_QUIT;
+ SDL_PushEvent(&event);
+}
+#endif
+
+static Uint32
+ActionTimerCallback(Uint32 interval, void* param)
+{
+ SDL_Event event;
+ SDL_UserEvent userevent;
+ Uint32 next_action_time;
+
+ /* push an event to handle the action */
+ userevent.type = SDL_USEREVENT;
+ userevent.code = ACTION_TIMER_EVENT;
+ userevent.data1 = ¤t->action;
+ userevent.data2 = NULL;
+
+ event.type = SDL_USEREVENT;
+ event.user = userevent;
+ SDL_PushEvent(&event);
+
+ /* calculate the new interval and return it */
+ if(current->next)
+ next_action_time = current->next->action.time - current->action.time;
+ else
+ {
+ next_action_time = 0;
+ action_timer = 0;
+ }
+
+ current = current->next;
+ return next_action_time;
+}
+
+static Uint32
+KillTimerCallback(Uint32 interval, void* param)
+{
+ SDL_Event event;
+ SDL_UserEvent userevent;
+
+ userevent.type = SDL_USEREVENT;
+ userevent.code = KILL_TIMER_EVENT;
+ userevent.data1 = NULL;
+ userevent.data2 = NULL;
+
+ event.type = SDL_USEREVENT;
+ event.user = userevent;
+ SDL_PushEvent(&event);
+
+ kill_timer = 0;
+ return 0;
+}
+
+static int
+ProcessAction(SDLVisualTest_Action* action, int* sut_running, char* args)
+{
+ if(!action || !sut_running)
+ return TEST_ERROR;
+
+ switch(action->type)
+ {
+ case SDL_ACTION_KILL:
+ SDLTest_Log("Action: Kill SUT");
+ if(SDL_IsProcessRunning(&pinfo) == 1 &&
+ !SDL_KillProcess(&pinfo, &sut_exitstatus))
+ {
+ SDLTest_LogError("SDL_KillProcess() failed");
+ return TEST_ERROR;
+ }
+ *sut_running = 0;
+ break;
+
+ case SDL_ACTION_QUIT:
+ SDLTest_Log("Action: Quit SUT");
+ if(SDL_IsProcessRunning(&pinfo) == 1 &&
+ !SDL_QuitProcess(&pinfo, &sut_exitstatus))
+ {
+ SDLTest_LogError("SDL_QuitProcess() failed");
+ return TEST_FAILED;
+ }
+ *sut_running = 0;
+ break;
+
+ case SDL_ACTION_LAUNCH:
+ {
+ char* path;
+ char* args;
+ SDL_ProcessInfo action_process;
+ SDL_ProcessExitStatus ps;
+
+ path = action->extra.process.path;
+ args = action->extra.process.args;
+ if(args)
+ {
+ SDLTest_Log("Action: Launch process: %s with arguments: %s",
+ path, args);
+ }
+ else
+ SDLTest_Log("Action: Launch process: %s", path);
+ if(!SDL_LaunchProcess(path, args, &action_process))
+ {
+ SDLTest_LogError("SDL_LaunchProcess() failed");
+ return TEST_ERROR;
+ }
+
+ /* small delay so that the process can do its job */
+ SDL_Delay(1000);
+
+ if(SDL_IsProcessRunning(&action_process) > 0)
+ {
+ SDLTest_LogError("Process %s took too long too complete."
+ " Force killing...", action->extra);
+ if(!SDL_KillProcess(&action_process, &ps))
+ {
+ SDLTest_LogError("SDL_KillProcess() failed");
+ return TEST_ERROR;
+ }
+ }
+ }
+ break;
+
+ case SDL_ACTION_SCREENSHOT:
+ {
+ char path[MAX_PATH_LEN], hash[33];
+
+ SDLTest_Log("Action: Take screenshot");
+ /* can't take a screenshot if the SUT isn't running */
+ if(SDL_IsProcessRunning(&pinfo) != 1)
+ {
+ SDLTest_LogError("SUT has quit.");
+ *sut_running = 0;
+ return TEST_FAILED;
+ }
+
+ /* file name for the screenshot image */
+ SDLVisualTest_HashString(args, hash);
+ SDL_snprintf(path, MAX_PATH_LEN, "%s/%s", state.output_dir, hash);
+ if(!SDLVisualTest_ScreenshotProcess(&pinfo, path))
+ {
+ SDLTest_LogError("SDLVisualTest_ScreenshotProcess() failed");
+ return TEST_ERROR;
+ }
+ }
+ break;
+
+ case SDL_ACTION_VERIFY:
+ {
+ int ret;
+
+ SDLTest_Log("Action: Verify screenshot");
+ ret = SDLVisualTest_VerifyScreenshots(args, state.output_dir,
+ state.verify_dir);
+
+ if(ret == -1)
+ {
+ SDLTest_LogError("SDLVisualTest_VerifyScreenshots() failed");
+ return TEST_ERROR;
+ }
+ else if(ret == 0)
+ {
+ SDLTest_Log("Verification failed: Images were not equal.");
+ return TEST_FAILED;
+ }
+ else if(ret == 1)
+ SDLTest_Log("Verification successful.");
+ else
+ {
+ SDLTest_Log("Verfication skipped.");
+ return TEST_FAILED;
+ }
+ }
+ break;
+
+ default:
+ SDLTest_LogError("Invalid action type");
+ return TEST_ERROR;
+ break;
+ }
+
+ return TEST_PASSED;
+}
+
+static int
+RunSUTAndTest(char* sutargs, int variation_num)
+{
+ int success, sut_running, return_code;
+ char hash[33];
+ SDL_Event event;
+
+ return_code = TEST_PASSED;
+
+ if(!sutargs)
+ {
+ SDLTest_LogError("sutargs argument cannot be NULL");
+ return_code = TEST_ERROR;
+ goto runsutandtest_cleanup_generic;
+ }
+
+ SDLVisualTest_HashString(sutargs, hash);
+ SDLTest_Log("Hash: %s", hash);
+
+ success = SDL_LaunchProcess(state.sutapp, sutargs, &pinfo);
+ if(!success)
+ {
+ SDLTest_Log("Could not launch SUT.");
+ return_code = TEST_ERROR;
+ goto runsutandtest_cleanup_generic;
+ }
+ SDLTest_Log("SUT launch successful.");
+ SDLTest_Log("Process will be killed in %d milliseconds", state.timeout);
+ sut_running = 1;
+
+ /* launch the timers */
+ SDLTest_Log("Performing actions..");
+ current = state.action_queue.front;
+ action_timer = 0;
+ kill_timer = 0;
+ if(current)
+ {
+ action_timer = SDL_AddTimer(current->action.time, ActionTimerCallback, NULL);
+ if(!action_timer)
+ {
+ SDLTest_LogError("SDL_AddTimer() failed");
+ return_code = TEST_ERROR;
+ goto runsutandtest_cleanup_timer;
+ }
+ }
+ kill_timer = SDL_AddTimer(state.timeout, KillTimerCallback, NULL);
+ if(!kill_timer)
+ {
+ SDLTest_LogError("SDL_AddTimer() failed");
+ return_code = TEST_ERROR;
+ goto runsutandtest_cleanup_timer;
+ }
+
+ /* the timer stops running if the actions queue is empty, and the
+ SUT stops running if it crashes or if we encounter a KILL/QUIT action */
+ while(sut_running)
+ {
+ /* process the actions by using an event queue */
+ while(SDL_PollEvent(&event))
+ {
+ if(event.type == SDL_USEREVENT)
+ {
+ if(event.user.code == ACTION_TIMER_EVENT)
+ {
+ SDLVisualTest_Action* action;
+
+ action = (SDLVisualTest_Action*)event.user.data1;
+
+ switch(ProcessAction(action, &sut_running, sutargs))
+ {
+ case TEST_PASSED:
+ break;
+
+ case TEST_FAILED:
+ return_code = TEST_FAILED;
+ goto runsutandtest_cleanup_timer;
+ break;
+
+ default:
+ SDLTest_LogError("ProcessAction() failed");
+ return_code = TEST_ERROR;
+ goto runsutandtest_cleanup_timer;
+ }
+ }
+ else if(event.user.code == KILL_TIMER_EVENT)
+ {
+ SDLTest_LogError("Maximum timeout reached. Force killing..");
+ return_code = TEST_FAILED;
+ goto runsutandtest_cleanup_timer;
+ }
+ }
+ else if(event.type == SDL_QUIT)
+ {
+ SDLTest_LogError("Received QUIT event. Testharness is quitting..");
+ return_code = TEST_ERROR;
+ goto runsutandtest_cleanup_timer;
+ }
+ }
+ SDL_Delay(1000/ACTION_LOOP_FPS);
+ }
+
+ SDLTest_Log("SUT exit code was: %d", sut_exitstatus.exit_status);
+ if(sut_exitstatus.exit_status == 0)
+ {
+ return_code = TEST_PASSED;
+ goto runsutandtest_cleanup_timer;
+ }
+ else
+ {
+ return_code = TEST_FAILED;
+ goto runsutandtest_cleanup_timer;
+ }
+
+ return_code = TEST_ERROR;
+ goto runsutandtest_cleanup_generic;
+
+runsutandtest_cleanup_timer:
+ if(action_timer && !SDL_RemoveTimer(action_timer))
+ {
+ SDLTest_Log("SDL_RemoveTimer() failed");
+ return_code = TEST_ERROR;
+ }
+
+ if(kill_timer && !SDL_RemoveTimer(kill_timer))
+ {
+ SDLTest_Log("SDL_RemoveTimer() failed");
+ return_code = TEST_ERROR;
+ }
+/* runsutandtest_cleanup_process: */
+ if(SDL_IsProcessRunning(&pinfo) && !SDL_KillProcess(&pinfo, &sut_exitstatus))
+ {
+ SDLTest_Log("SDL_KillProcess() failed");
+ return_code = TEST_ERROR;
+ }
+runsutandtest_cleanup_generic:
+ return return_code;
+}
+
+/** Entry point for testharness */
+int
+main(int argc, char* argv[])
+{
+ int i, passed, return_code, failed;
+
+ /* freeing resources, linux style! */
+ return_code = 0;
+
+ if(argc < 2)
+ {
+ SDLTest_Log(usage(), argv[0]);
+ goto cleanup_generic;
+ }
+
+#if defined(__LINUX__) || defined(__CYGWIN__)
+ signal(SIGINT, CtrlCHandlerCallback);
+#endif
+
+ /* parse arguments */
+ if(!SDLVisualTest_ParseHarnessArgs(argv + 1, &state))
+ {
+ SDLTest_Log(usage(), argv[0]);
+ return_code = 1;
+ goto cleanup_generic;
+ }
+ SDLTest_Log("Parsed harness arguments successfully.");
+
+ /* initialize SDL */
+ if(SDL_Init(SDL_INIT_TIMER) == -1)
+ {
+ SDLTest_LogError("SDL_Init() failed.");
+ SDLVisualTest_FreeHarnessState(&state);
+ return_code = 1;
+ goto cleanup_harness_state;
+ }
+
+ /* create an output directory if none exists */
+#if defined(__LINUX__) || defined(__CYGWIN__)
+ mkdir(state.output_dir, 0777);
+#elif defined(__WIN32__)
+ _mkdir(state.output_dir);
+#else
+#error "Unsupported platform"
+#endif
+
+ /* test with sutargs */
+ if(SDL_strlen(state.sutargs))
+ {
+ SDLTest_Log("Running: %s %s", state.sutapp, state.sutargs);
+ if(!state.no_launch)
+ {
+ switch(RunSUTAndTest(state.sutargs, 0))
+ {
+ case TEST_PASSED:
+ SDLTest_Log("Status: PASSED");
+ break;
+
+ case TEST_FAILED:
+ SDLTest_Log("Status: FAILED");
+ break;
+
+ case TEST_ERROR:
+ SDLTest_LogError("Some error occurred while testing.");
+ return_code = 1;
+ goto cleanup_sdl;
+ break;
+ }
+ }
+ }
+
+ if(state.sut_config.num_options > 0)
+ {
+ char* variator_name = state.variator_type == SDL_VARIATOR_RANDOM ?
+ "RANDOM" : "EXHAUSTIVE";
+ if(state.num_variations > 0)
+ SDLTest_Log("Testing SUT with variator: %s for %d variations",
+ variator_name, state.num_variations);
+ else
+ SDLTest_Log("Testing SUT with variator: %s and ALL variations",
+ variator_name);
+ /* initialize the variator */
+ if(!SDLVisualTest_InitVariator(&variator, &state.sut_config,
+ state.variator_type, 0))
+ {
+ SDLTest_LogError("Could not initialize variator");
+ return_code = 1;
+ goto cleanup_sdl;
+ }
+
+ /* iterate through all the variations */
+ passed = 0;
+ failed = 0;
+ for(i = 0; state.num_variations > 0 ? (i < state.num_variations) : 1; i++)
+ {
+ char* args = SDLVisualTest_GetNextVariation(&variator);
+ if(!args)
+ break;
+ SDLTest_Log("\nVariation number: %d\nArguments: %s", i + 1, args);
+
+ if(!state.no_launch)
+ {
+ switch(RunSUTAndTest(args, i + 1))
+ {
+ case TEST_PASSED:
+ SDLTest_Log("Status: PASSED");
+ passed++;
+ break;
+
+ case TEST_FAILED:
+ SDLTest_Log("Status: FAILED");
+ failed++;
+ break;
+
+ case TEST_ERROR:
+ SDLTest_LogError("Some error occurred while testing.");
+ goto cleanup_variator;
+ break;
+ }
+ }
+ }
+ if(!state.no_launch)
+ {
+ /* report stats */
+ SDLTest_Log("Testing complete.");
+ SDLTest_Log("%d/%d tests passed.", passed, passed + failed);
+ }
+ goto cleanup_variator;
+ }
+
+ goto cleanup_sdl;
+
+cleanup_variator:
+ SDLVisualTest_FreeVariator(&variator);
+cleanup_sdl:
+ SDL_Quit();
+cleanup_harness_state:
+ SDLVisualTest_FreeHarnessState(&state);
+cleanup_generic:
+ return return_code;
+}
diff --git a/visualtest/src/variator_common.c b/visualtest/src/variator_common.c
new file mode 100755
index 000000000..dec3d8aac
--- /dev/null
+++ b/visualtest/src/variator_common.c
@@ -0,0 +1,225 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file variator_common.c
+ *
+ * Source file for some common functionality used by variators.
+ */
+
+#include
+#include "SDL_visualtest_variator_common.h"
+
+int
+SDLVisualTest_NextValue(SDLVisualTest_SUTOptionValue* var,
+ SDLVisualTest_SUTOption* opt)
+{
+ if(!var)
+ {
+ SDLTest_LogError("var argument cannot be NULL");
+ return -1;
+ }
+ if(!opt)
+ {
+ SDLTest_LogError("opt argument cannot be NULL");
+ return -1;
+ }
+
+ switch(opt->type)
+ {
+ case SDL_SUT_OPTIONTYPE_BOOL:
+ if(var->bool_value)
+ {
+ var->bool_value = SDL_FALSE;
+ return 1;
+ }
+ else
+ {
+ var->bool_value = SDL_TRUE;
+ return 0;
+ }
+ break;
+
+ case SDL_SUT_OPTIONTYPE_ENUM:
+ var->enumerated.index++;
+ if(!opt->data.enum_values[var->enumerated.index])
+ {
+ var->enumerated.index = 0;
+ return 1;
+ }
+ return 0;
+ break;
+
+ case SDL_SUT_OPTIONTYPE_INT:
+ {
+ int increment = (opt->data.range.max - opt->data.range.min) /
+ SDL_SUT_INTEGER_OPTION_TEST_STEPS;
+ /* prevents infinite loop when rounding */
+ if(increment == 0)
+ increment = 1;
+ var->integer.value += increment;
+ if(var->integer.value > opt->data.range.max)
+ {
+ var->integer.value = opt->data.range.min;
+ return 1;
+ }
+ return 0;
+ }
+ break;
+
+ case SDL_SUT_OPTIONTYPE_STRING:
+ return 1;
+ break;
+ }
+ return -1;
+}
+
+int
+SDLVisualTest_MakeStrFromVariation(SDLVisualTest_Variation* variation,
+ SDLVisualTest_SUTConfig* config,
+ char* buffer, int size)
+{
+ int i, index;
+ SDLVisualTest_SUTOptionValue* vars;
+ SDLVisualTest_SUTOption* options;
+ if(!variation)
+ {
+ SDLTest_LogError("variation argument cannot be NULL");
+ return 0;
+ }
+ if(!config)
+ {
+ SDLTest_LogError("config argument cannot be NULL");
+ return 0;
+ }
+ if(!buffer)
+ {
+ SDLTest_LogError("buffer argument cannot be NULL");
+ return 0;
+ }
+ if(size <= 0)
+ {
+ SDLTest_LogError("size argument should be positive");
+ return 0;
+ }
+
+ index = 0;
+ buffer[0] = '\0';
+ options = config->options;
+ vars = variation->vars;
+ for(i = 0; i < variation->num_vars; i++)
+ {
+ int n, enum_index;
+ if(index >= size - 1)
+ {
+ SDLTest_LogError("String did not fit in buffer size");
+ return 0;
+ }
+ switch(options[i].type)
+ {
+ case SDL_SUT_OPTIONTYPE_BOOL:
+ if(vars[i].bool_value)
+ {
+ n = SDL_snprintf(buffer + index, size - index, "%s ",
+ options[i].name);
+ if(n <= 0)
+ {
+ SDLTest_LogError("SDL_snprintf() failed");
+ return 0;
+ }
+ index += n;
+ }
+ break;
+
+ case SDL_SUT_OPTIONTYPE_ENUM:
+ if(vars[i].enumerated.on)
+ {
+ enum_index = vars[i].enumerated.index;
+ n = SDL_snprintf(buffer + index, size - index, "%s %s ",
+ options[i].name, options[i].data.enum_values[enum_index]);
+ index += n;
+ }
+ break;
+
+ case SDL_SUT_OPTIONTYPE_INT:
+ if(vars[i].integer.on)
+ {
+ n = SDL_snprintf(buffer + index, size - index, "%s %d ",
+ options[i].name, vars[i].integer.value);
+ index += n;
+ }
+ break;
+
+ case SDL_SUT_OPTIONTYPE_STRING:
+ if(vars[i].string.on)
+ {
+ n = SDL_snprintf(buffer + index, size - index, "%s %s ",
+ options[i].name, vars[i].string.value);
+ index += n;
+ }
+ break;
+ }
+ }
+ return 1;
+}
+
+int
+SDLVisualTest_InitVariation(SDLVisualTest_Variation* variation,
+ SDLVisualTest_SUTConfig* config)
+{
+ int i;
+ SDLVisualTest_SUTOptionValue* vars;
+ SDLVisualTest_SUTOption* options;
+ if(!variation)
+ {
+ SDLTest_LogError("variation argument cannot be NULL");
+ return 0;
+ }
+ if(!config)
+ {
+ SDLTest_LogError("config argument cannot be NULL");
+ return 0;
+ }
+
+ /* initialize the first variation */
+ if(config->num_options <= 0)
+ {
+ SDLTest_LogError("config->num_options must be positive");
+ return 0;
+ }
+ variation->vars = (SDLVisualTest_SUTOptionValue*)SDL_malloc(config->num_options *
+ sizeof(SDLVisualTest_SUTOptionValue));
+ if(!variation->vars)
+ {
+ SDLTest_LogError("malloc() failed");
+ return 0;
+ }
+ variation->num_vars = config->num_options;
+ vars = variation->vars;
+ options = config->options;
+ for(i = 0; i < variation->num_vars; i++)
+ {
+ switch(options[i].type)
+ {
+ case SDL_SUT_OPTIONTYPE_BOOL:
+ vars[i].bool_value = SDL_FALSE;
+ break;
+
+ case SDL_SUT_OPTIONTYPE_ENUM:
+ vars[i].enumerated.on = SDL_TRUE;
+ vars[i].enumerated.index = 0;
+ break;
+
+ case SDL_SUT_OPTIONTYPE_INT:
+ {
+ vars[i].integer.on = SDL_TRUE;
+ vars[i].integer.value = options[i].data.range.min;
+ }
+ break;
+
+ case SDL_SUT_OPTIONTYPE_STRING:
+ vars[i].string.on = SDL_TRUE;
+ vars[i].string.value = options[i].name;
+ break;
+ }
+ }
+ return 1;
+}
\ No newline at end of file
diff --git a/visualtest/src/variator_exhaustive.c b/visualtest/src/variator_exhaustive.c
new file mode 100755
index 000000000..2a0ab35c7
--- /dev/null
+++ b/visualtest/src/variator_exhaustive.c
@@ -0,0 +1,132 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file variator_exhaustive.c
+ *
+ * Source file for the variator that tests the SUT with all the different
+ * variations of input parameters that are valid.
+ */
+
+#include
+#include
+#include "SDL_visualtest_sut_configparser.h"
+#include "SDL_visualtest_exhaustive_variator.h"
+
+static int
+NextVariation(SDLVisualTest_Variation* variation,
+ SDLVisualTest_SUTConfig* config)
+{
+ int i, carry;
+ if(!variation)
+ {
+ SDLTest_LogError("variation argument cannot be NULL");
+ return -1;
+ }
+ if(!config)
+ {
+ SDLTest_LogError("config argument cannot be NULL");
+ return -1;
+ }
+
+ carry = 1;
+ for(i = 0; i < variation->num_vars; i++)
+ {
+ carry = SDLVisualTest_NextValue(&variation->vars[i], &config->options[i]);
+ if(carry != 1)
+ break;
+ }
+
+ if(carry == 1) /* we're done, we've tried all possible variations */
+ return 0;
+ if(carry == 0)
+ return 1;
+ SDLTest_LogError("NextVariation() failed");
+ return -1;
+}
+
+int
+SDLVisualTest_InitExhaustiveVariator(SDLVisualTest_ExhaustiveVariator* variator,
+ SDLVisualTest_SUTConfig* config)
+{
+ if(!variator)
+ {
+ SDLTest_LogError("variator argument cannot be NULL");
+ return 0;
+ }
+ if(!config)
+ {
+ SDLTest_LogError("config argument cannot be NULL");
+ return 0;
+ }
+
+ SDLTest_FuzzerInit(time(NULL));
+
+ variator->config = *config;
+ variator->variation.num_vars = 0;
+ variator->variation.vars = NULL;
+
+ return 1;
+}
+
+/* TODO: Right now variations where an option is not specified at all are not
+ tested for. This can be implemented by switching the on attribute for integer,
+ enum and string options to true and false. */
+char*
+SDLVisualTest_GetNextExhaustiveVariation(SDLVisualTest_ExhaustiveVariator* variator)
+{
+ int success;
+ if(!variator)
+ {
+ SDLTest_LogError("variator argument cannot be NULL");
+ return NULL;
+ }
+
+ if(!variator->variation.vars) /* the first time this function is called */
+ {
+ success = SDLVisualTest_InitVariation(&variator->variation,
+ &variator->config);
+ if(!success)
+ {
+ SDLTest_LogError("SDLVisualTest_InitVariation() failed");
+ return NULL;
+ }
+ success = SDLVisualTest_MakeStrFromVariation(&variator->variation,
+ &variator->config, variator->buffer, MAX_SUT_ARGS_LEN);
+ if(!success)
+ {
+ SDLTest_LogError("SDLVisualTest_MakeStrFromVariation() failed");
+ return NULL;
+ }
+ return variator->buffer;
+ }
+ else
+ {
+ success = NextVariation(&variator->variation, &variator->config);
+ if(success == 1)
+ {
+ success = SDLVisualTest_MakeStrFromVariation(&variator->variation,
+ &variator->config, variator->buffer, MAX_SUT_ARGS_LEN);
+ if(!success)
+ {
+ SDLTest_LogError("SDLVisualTest_MakeStrFromVariation() failed");
+ return NULL;
+ }
+ return variator->buffer;
+ }
+ else if(success == -1)
+ SDLTest_LogError("NextVariation() failed.");
+ return NULL;
+ }
+ return NULL;
+}
+
+void
+SDLVisualTest_FreeExhaustiveVariator(SDLVisualTest_ExhaustiveVariator* variator)
+{
+ if(!variator)
+ {
+ SDLTest_LogError("variator argument cannot be NULL");
+ return;
+ }
+ SDL_free(variator->variation.vars);
+ variator->variation.vars = NULL;
+}
\ No newline at end of file
diff --git a/visualtest/src/variator_random.c b/visualtest/src/variator_random.c
new file mode 100755
index 000000000..14b5d48a8
--- /dev/null
+++ b/visualtest/src/variator_random.c
@@ -0,0 +1,111 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file variator_random.c
+ *
+ * Source file for the variator that tests the SUT with random variations to the
+ * input parameters.
+ */
+
+#include
+#include
+#include "SDL_visualtest_random_variator.h"
+
+int
+SDLVisualTest_InitRandomVariator(SDLVisualTest_RandomVariator* variator,
+ SDLVisualTest_SUTConfig* config, Uint64 seed)
+{
+ if(!variator)
+ {
+ SDLTest_LogError("variator argument cannot be NULL");
+ return 0;
+ }
+ if(!config)
+ {
+ SDLTest_LogError("config argument cannot be NULL");
+ return 0;
+ }
+
+ if(seed)
+ SDLTest_FuzzerInit(seed);
+ else
+ SDLTest_FuzzerInit(time(NULL));
+
+ variator->config = *config;
+
+ if(!SDLVisualTest_InitVariation(&variator->variation, &variator->config))
+ {
+ SDLTest_LogError("SDLVisualTest_InitVariation() failed");
+ return 0;
+ }
+
+ return 1;
+}
+
+char*
+SDLVisualTest_GetNextRandomVariation(SDLVisualTest_RandomVariator* variator)
+{
+ SDLVisualTest_SUTOptionValue* vars;
+ SDLVisualTest_SUTOption* options;
+ int i;
+ if(!variator)
+ {
+ SDLTest_LogError("variator argument cannot be NULL");
+ return NULL;
+ }
+
+ /* to save typing */
+ vars = variator->variation.vars;
+ options = variator->config.options;
+
+ /* generate a random variation */
+ for(i = 0; i < variator->variation.num_vars; i++)
+ {
+ switch(options[i].type)
+ {
+ case SDL_SUT_OPTIONTYPE_BOOL:
+ vars[i].bool_value = SDLTest_RandomIntegerInRange(0, 1) ? SDL_FALSE :
+ SDL_TRUE;
+ break;
+
+ case SDL_SUT_OPTIONTYPE_ENUM:
+ {
+ int emx = 0;
+ while(options[i].data.enum_values[emx])
+ emx++;
+ vars[i].enumerated.index = SDLTest_RandomIntegerInRange(0, emx - 1);
+ }
+ break;
+
+ case SDL_SUT_OPTIONTYPE_INT:
+ vars[i].integer.value = SDLTest_RandomIntegerInRange(
+ options[i].data.range.min,
+ options[i].data.range.max);
+ break;
+
+ case SDL_SUT_OPTIONTYPE_STRING:
+ // String values are left unchanged
+ break;
+ }
+ }
+
+ /* convert variation to an arguments string */
+ if(!SDLVisualTest_MakeStrFromVariation(&variator->variation, &variator->config,
+ variator->buffer, MAX_SUT_ARGS_LEN))
+ {
+ SDLTest_LogError("SDLVisualTest_MakeStrFromVariation() failed");
+ return NULL;
+ }
+
+ return variator->buffer;
+}
+
+void SDLVisualTest_FreeRandomVariator(SDLVisualTest_RandomVariator* variator)
+{
+ if(!variator)
+ {
+ SDLTest_LogError("variator argument cannot be NULL");
+ return;
+ }
+ SDL_free(variator->variation.vars);
+ variator->variation.vars = NULL;
+}
\ No newline at end of file
diff --git a/visualtest/src/variators.c b/visualtest/src/variators.c
new file mode 100755
index 000000000..2d63113c5
--- /dev/null
+++ b/visualtest/src/variators.c
@@ -0,0 +1,93 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file variators.c
+ *
+ * Source file for the operations that act on variators.
+ */
+
+#include
+#include "SDL_visualtest_variators.h"
+
+int
+SDLVisualTest_InitVariator(SDLVisualTest_Variator* variator,
+ SDLVisualTest_SUTConfig* config,
+ SDLVisualTest_VariatorType type,
+ Uint64 seed)
+{
+ if(!variator)
+ {
+ SDLTest_LogError("variator argument cannot be NULL");
+ return 0;
+ }
+ if(!config)
+ {
+ SDLTest_LogError("config argument cannot be NULL");
+ return 0;
+ }
+
+ variator->type = type;
+ switch(type)
+ {
+ case SDL_VARIATOR_EXHAUSTIVE:
+ return SDLVisualTest_InitExhaustiveVariator(&variator->data.exhaustive,
+ config);
+ break;
+
+ case SDL_VARIATOR_RANDOM:
+ return SDLVisualTest_InitRandomVariator(&variator->data.random,
+ config, seed);
+ break;
+
+ default:
+ SDLTest_LogError("Invalid value for variator type");
+ return 0;
+ }
+ return 0;
+}
+
+char*
+SDLVisualTest_GetNextVariation(SDLVisualTest_Variator* variator)
+{
+ if(!variator)
+ {
+ SDLTest_LogError("variator argument cannot be NULL");
+ return NULL;
+ }
+ switch(variator->type)
+ {
+ case SDL_VARIATOR_EXHAUSTIVE:
+ return SDLVisualTest_GetNextExhaustiveVariation(&variator->data.exhaustive);
+ break;
+
+ case SDL_VARIATOR_RANDOM:
+ return SDLVisualTest_GetNextRandomVariation(&variator->data.random);
+ break;
+
+ default:
+ SDLTest_LogError("Invalid value for variator type");
+ return NULL;
+ }
+ return NULL;
+}
+
+void SDLVisualTest_FreeVariator(SDLVisualTest_Variator* variator)
+{
+ if(!variator)
+ {
+ SDLTest_LogError("variator argument cannot be NULL");
+ return;
+ }
+ switch(variator->type)
+ {
+ case SDL_VARIATOR_EXHAUSTIVE:
+ SDLVisualTest_FreeExhaustiveVariator(&variator->data.exhaustive);
+ break;
+
+ case SDL_VARIATOR_RANDOM:
+ SDLVisualTest_FreeRandomVariator(&variator->data.random);
+ break;
+
+ default:
+ SDLTest_LogError("Invalid value for variator type");
+ }
+}
\ No newline at end of file
diff --git a/visualtest/src/windows/windows_process.c b/visualtest/src/windows/windows_process.c
new file mode 100755
index 000000000..ad0938951
--- /dev/null
+++ b/visualtest/src/windows/windows_process.c
@@ -0,0 +1,284 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file windows_process.c
+ *
+ * Source file for the process API on windows.
+ */
+
+
+#include
+#include
+#include
+#include
+
+#include "SDL_visualtest_process.h"
+
+#if defined(__WIN32__)
+
+void
+LogLastError(char* str)
+{
+ LPVOID buffer;
+ DWORD dw = GetLastError();
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|
+ FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buffer,
+ 0, NULL);
+ SDLTest_LogError("%s: %s", str, (char*)buffer);
+ LocalFree(buffer);
+}
+
+int
+SDL_LaunchProcess(char* file, char* args, SDL_ProcessInfo* pinfo)
+{
+ BOOL success;
+ char* working_directory;
+ char* command_line;
+ int path_length, args_length;
+ STARTUPINFO sui = {0};
+ sui.cb = sizeof(sui);
+
+ if(!file)
+ {
+ SDLTest_LogError("Path to executable to launched cannot be NULL.");
+ return 0;
+ }
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo cannot be NULL.");
+ return 0;
+ }
+
+ /* get the working directory of the process being launched, so that
+ the process can load any resources it has in it's working directory */
+ path_length = SDL_strlen(file);
+ if(path_length == 0)
+ {
+ SDLTest_LogError("Length of the file parameter is zero.");
+ return 0;
+ }
+
+ working_directory = (char*)SDL_malloc(path_length + 1);
+ if(!working_directory)
+ {
+ SDLTest_LogError("Could not allocate working_directory - malloc() failed.");
+ return 0;
+ }
+
+ SDL_memcpy(working_directory, file, path_length + 1);
+ PathRemoveFileSpec(working_directory);
+ if(SDL_strlen(working_directory) == 0)
+ {
+ SDL_free(working_directory);
+ working_directory = NULL;
+ }
+
+ /* join the file path and the args string together */
+ if(!args)
+ args = "";
+ args_length = SDL_strlen(args);
+ command_line = (char*)SDL_malloc(path_length + args_length + 2);
+ if(!command_line)
+ {
+ SDLTest_LogError("Could not allocate command_line - malloc() failed.");
+ return 0;
+ }
+ SDL_memcpy(command_line, file, path_length);
+ command_line[path_length] = ' ';
+ SDL_memcpy(command_line + path_length + 1, args, args_length + 1);
+
+ /* create the process */
+ success = CreateProcess(NULL, command_line, NULL, NULL, FALSE,
+ NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,
+ NULL, working_directory, &sui, &pinfo->pi);
+ if(working_directory)
+ {
+ SDL_free(working_directory);
+ working_directory = NULL;
+ }
+ SDL_free(command_line);
+ if(!success)
+ {
+ LogLastError("CreateProcess() failed");
+ return 0;
+ }
+
+ return 1;
+}
+
+int
+SDL_GetProcessExitStatus(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps)
+{
+ DWORD exit_status;
+ BOOL success;
+
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo cannot be NULL");
+ return 0;
+ }
+ if(!ps)
+ {
+ SDLTest_LogError("ps cannot be NULL");
+ return 0;
+ }
+
+ /* get the exit code */
+ success = GetExitCodeProcess(pinfo->pi.hProcess, &exit_status);
+ if(!success)
+ {
+ LogLastError("GetExitCodeProcess() failed");
+ return 0;
+ }
+
+ if(exit_status == STILL_ACTIVE)
+ ps->exit_status = -1;
+ else
+ ps->exit_status = exit_status;
+ ps->exit_success = 1;
+ return 1;
+}
+
+
+int
+SDL_IsProcessRunning(SDL_ProcessInfo* pinfo)
+{
+ DWORD exit_status;
+ BOOL success;
+
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo cannot be NULL");
+ return -1;
+ }
+
+ success = GetExitCodeProcess(pinfo->pi.hProcess, &exit_status);
+ if(!success)
+ {
+ LogLastError("GetExitCodeProcess() failed");
+ return -1;
+ }
+
+ if(exit_status == STILL_ACTIVE)
+ return 1;
+ return 0;
+}
+
+static BOOL CALLBACK
+CloseWindowCallback(HWND hwnd, LPARAM lparam)
+{
+ DWORD pid;
+ SDL_ProcessInfo* pinfo;
+
+ pinfo = (SDL_ProcessInfo*)lparam;
+
+ GetWindowThreadProcessId(hwnd, &pid);
+ if(pid == pinfo->pi.dwProcessId)
+ {
+ DWORD result;
+ if(!SendMessageTimeout(hwnd, WM_CLOSE, 0, 0, SMTO_BLOCK,
+ 1000, &result))
+ {
+ if(GetLastError() != ERROR_TIMEOUT)
+ {
+ LogLastError("SendMessageTimeout() failed");
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+int
+SDL_QuitProcess(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps)
+{
+ DWORD wait_result;
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo argument cannot be NULL");
+ return 0;
+ }
+ if(!ps)
+ {
+ SDLTest_LogError("ps argument cannot be NULL");
+ return 0;
+ }
+
+ /* enumerate through all the windows, trying to close each one */
+ if(!EnumWindows(CloseWindowCallback, (LPARAM)pinfo))
+ {
+ SDLTest_LogError("EnumWindows() failed");
+ return 0;
+ }
+
+ /* wait until the process terminates */
+ wait_result = WaitForSingleObject(pinfo->pi.hProcess, 1000);
+ if(wait_result == WAIT_FAILED)
+ {
+ LogLastError("WaitForSingleObject() failed");
+ return 0;
+ }
+ if(wait_result != WAIT_OBJECT_0)
+ {
+ SDLTest_LogError("Process did not quit.");
+ return 0;
+ }
+
+ /* get the exit code */
+ if(!SDL_GetProcessExitStatus(pinfo, ps))
+ {
+ SDLTest_LogError("SDL_GetProcessExitStatus() failed");
+ return 0;
+ }
+
+ return 1;
+}
+
+int
+SDL_KillProcess(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps)
+{
+ BOOL success;
+ DWORD exit_status, wait_result;
+
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo argument cannot be NULL");
+ return 0;
+ }
+ if(!ps)
+ {
+ SDLTest_LogError("ps argument cannot be NULL");
+ return 0;
+ }
+
+ /* initiate termination of the process */
+ success = TerminateProcess(pinfo->pi.hProcess, 0);
+ if(!success)
+ {
+ LogLastError("TerminateProcess() failed");
+ return 0;
+ }
+
+ /* wait until the process terminates */
+ wait_result = WaitForSingleObject(pinfo->pi.hProcess, INFINITE);
+ if(wait_result == WAIT_FAILED)
+ {
+ LogLastError("WaitForSingleObject() failed");
+ return 0;
+ }
+
+ /* get the exit code */
+ success = GetExitCodeProcess(pinfo->pi.hProcess, &exit_status);
+ if(!success)
+ {
+ LogLastError("GetExitCodeProcess() failed");
+ return 0;
+ }
+
+ ps->exit_status = exit_status;
+ ps->exit_success = 1;
+
+ return 1;
+}
+
+#endif
diff --git a/visualtest/src/windows/windows_screenshot.c b/visualtest/src/windows/windows_screenshot.c
new file mode 100755
index 000000000..785590359
--- /dev/null
+++ b/visualtest/src/windows/windows_screenshot.c
@@ -0,0 +1,349 @@
+/* See COPYING.txt for the full license governing this code. */
+/**
+ * \file windows_screenshot.c
+ *
+ * Source file for the screenshot API on windows.
+ */
+
+#include "SDL_visualtest_process.h"
+#include
+#include
+
+#if defined(__CYGWIN__)
+#include
+#endif
+
+#if defined(__WIN32__)
+#include
+
+void LogLastError(char* str);
+
+static int img_num;
+static SDL_ProcessInfo screenshot_pinfo;
+
+/* Saves a bitmap to a file using hdc as a device context */
+static int
+SaveBitmapToFile(HDC hdc, HBITMAP hbitmap, char* filename)
+{
+ BITMAP bitmap;
+ BITMAPFILEHEADER bfh;
+ BITMAPINFOHEADER bih;
+ DWORD bmpsize, bytes_written;
+ HANDLE hdib, hfile;
+ char* bmpdata;
+ int return_code = 1;
+
+ if(!hdc)
+ {
+ SDLTest_LogError("hdc argument is NULL");
+ return 0;
+ }
+ if(!hbitmap)
+ {
+ SDLTest_LogError("hbitmap argument is NULL");
+ return 0;
+ }
+ if(!filename)
+ {
+ SDLTest_LogError("filename argument is NULL");
+ return 0;
+ }
+
+ if(!GetObject(hbitmap, sizeof(BITMAP), (void*)&bitmap))
+ {
+ SDLTest_LogError("GetObject() failed");
+ return_code = 0;
+ goto savebitmaptofile_cleanup_generic;
+ }
+
+ bih.biSize = sizeof(BITMAPINFOHEADER);
+ bih.biWidth = bitmap.bmWidth;
+ bih.biHeight = bitmap.bmHeight;
+ bih.biPlanes = 1;
+ bih.biBitCount = 32;
+ bih.biCompression = BI_RGB;
+ bih.biSizeImage = 0;
+ bih.biXPelsPerMeter = 0;
+ bih.biYPelsPerMeter = 0;
+ bih.biClrUsed = 0;
+ bih.biClrImportant = 0;
+
+ bmpsize = ((bitmap.bmWidth * bih.biBitCount + 31) / 32) * 4 * bitmap.bmHeight;
+
+ hdib = GlobalAlloc(GHND, bmpsize);
+ if(!hdib)
+ {
+ LogLastError("GlobalAlloc() failed");
+ return_code = 0;
+ goto savebitmaptofile_cleanup_generic;
+ }
+ bmpdata = (char*)GlobalLock(hdib);
+ if(!bmpdata)
+ {
+ LogLastError("GlobalLock() failed");
+ return_code = 0;
+ goto savebitmaptofile_cleanup_hdib;
+ }
+
+ if(!GetDIBits(hdc, hbitmap, 0, (UINT)bitmap.bmHeight, bmpdata,
+ (LPBITMAPINFO)&bih, DIB_RGB_COLORS))
+ {
+ SDLTest_LogError("GetDIBits() failed");
+ return_code = 0;
+ goto savebitmaptofile_cleanup_unlockhdib;
+ }
+
+ hfile = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL, NULL);
+ if(hfile == INVALID_HANDLE_VALUE)
+ {
+ LogLastError("CreateFile()");
+ return_code = 0;
+ goto savebitmaptofile_cleanup_unlockhdib;
+ }
+ bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
+ bfh.bfSize = bmpsize + bfh.bfOffBits;
+ bfh.bfType = 0x4D42;
+
+ bytes_written = 0;
+ if(!WriteFile(hfile, (void*)&bfh, sizeof(BITMAPFILEHEADER), &bytes_written, NULL) ||
+ !WriteFile(hfile, (void*)&bih, sizeof(BITMAPINFOHEADER), &bytes_written, NULL) ||
+ !WriteFile(hfile, (void*)bmpdata, bmpsize, &bytes_written, NULL))
+ {
+ LogLastError("WriteFile() failed");
+ return_code = 0;
+ goto savebitmaptofile_cleanup_hfile;
+ }
+
+savebitmaptofile_cleanup_hfile:
+ CloseHandle(hfile);
+
+/* make the screenshot file writable on cygwin, since it could be overwritten later */
+#if defined(__CYGWIN__)
+ if(chmod(filename, 0777) == -1)
+ {
+ SDLTest_LogError("chmod() failed");
+ return_code = 0;
+ }
+#endif
+
+savebitmaptofile_cleanup_unlockhdib:
+ GlobalUnlock(hdib);
+
+savebitmaptofile_cleanup_hdib:
+ GlobalFree(hdib);
+
+savebitmaptofile_cleanup_generic:
+ return return_code;
+}
+
+/* Takes the screenshot of a window and saves it to a file. If only_client_area
+ is true, then only the client area of the window is considered */
+static int
+ScreenshotWindow(HWND hwnd, char* filename, SDL_bool only_client_area)
+{
+ int width, height;
+ RECT dimensions;
+ HDC windowdc, capturedc;
+ HBITMAP capturebitmap;
+ HGDIOBJ select_success;
+ BOOL blt_success;
+ int return_code = 1;
+
+ if(!filename)
+ {
+ SDLTest_LogError("filename argument cannot be NULL");
+ return_code = 0;
+ goto screenshotwindow_cleanup_generic;
+ }
+ if(!hwnd)
+ {
+ SDLTest_LogError("hwnd argument cannot be NULL");
+ return_code = 0;
+ goto screenshotwindow_cleanup_generic;
+ }
+
+ if(!GetWindowRect(hwnd, &dimensions))
+ {
+ LogLastError("GetWindowRect() failed");
+ return_code = 0;
+ goto screenshotwindow_cleanup_generic;
+ }
+
+ if(only_client_area)
+ {
+ RECT crect;
+ if(!GetClientRect(hwnd, &crect))
+ {
+ SDLTest_LogError("GetClientRect() failed");
+ return_code = 0;
+ goto screenshotwindow_cleanup_generic;
+ }
+
+ width = crect.right;
+ height = crect.bottom;
+ windowdc = GetDC(hwnd);
+ if(!windowdc)
+ {
+ SDLTest_LogError("GetDC() failed");
+ return_code = 0;
+ goto screenshotwindow_cleanup_generic;
+ }
+ }
+ else
+ {
+ width = dimensions.right - dimensions.left;
+ height = dimensions.bottom - dimensions.top;
+ windowdc = GetWindowDC(hwnd);
+ if(!windowdc)
+ {
+ SDLTest_LogError("GetWindowDC() failed");
+ return_code = 0;
+ goto screenshotwindow_cleanup_generic;
+ }
+ }
+
+ capturedc = CreateCompatibleDC(windowdc);
+ if(!capturedc)
+ {
+ SDLTest_LogError("CreateCompatibleDC() failed");
+ return_code = 0;
+ goto screenshotwindow_cleanup_windowdc;
+ }
+ capturebitmap = CreateCompatibleBitmap(windowdc, width, height);
+ if(!capturebitmap)
+ {
+ SDLTest_LogError("CreateCompatibleBitmap() failed");
+ return_code = 0;
+ goto screenshotwindow_cleanup_capturedc;
+ }
+ select_success = SelectObject(capturedc, capturebitmap);
+ if(!select_success || select_success == HGDI_ERROR)
+ {
+ SDLTest_LogError("SelectObject() failed");
+ return_code = 0;
+ goto screenshotwindow_cleanup_capturebitmap;
+ }
+ blt_success = BitBlt(capturedc, 0, 0, width, height, windowdc,
+ 0, 0, SRCCOPY|CAPTUREBLT);
+ if(!blt_success)
+ {
+ LogLastError("BitBlt() failed");
+ return_code = 0;
+ goto screenshotwindow_cleanup_capturebitmap;
+ }
+
+ /* save bitmap as file */
+ if(!SaveBitmapToFile(windowdc, capturebitmap, filename))
+ {
+ SDLTest_LogError("SaveBitmapToFile() failed");
+ return_code = 0;
+ goto screenshotwindow_cleanup_capturebitmap;
+ }
+
+ /* free resources */
+
+screenshotwindow_cleanup_capturebitmap:
+ if(!DeleteObject(capturebitmap))
+ {
+ SDLTest_LogError("DeleteObjectFailed");
+ return_code = 0;
+ }
+
+screenshotwindow_cleanup_capturedc:
+ if(!DeleteDC(capturedc))
+ {
+ SDLTest_LogError("DeleteDC() failed");
+ return_code = 0;
+ }
+
+screenshotwindow_cleanup_windowdc:
+ if(!ReleaseDC(hwnd, windowdc))
+ {
+ SDLTest_LogError("ReleaseDC() failed");
+ return_code = 0;;
+ }
+
+screenshotwindow_cleanup_generic:
+ return return_code;
+}
+
+/* Takes the screenshot of the entire desktop and saves it to a file */
+int SDLVisualTest_ScreenshotDesktop(char* filename)
+{
+ HWND hwnd;
+ hwnd = GetDesktopWindow();
+ return ScreenshotWindow(hwnd, filename, SDL_FALSE);
+}
+
+/* take screenshot of a window and save it to a file */
+static BOOL CALLBACK
+ScreenshotHwnd(HWND hwnd, LPARAM lparam)
+{
+ int len;
+ DWORD pid;
+ char* prefix;
+ char* filename;
+
+ GetWindowThreadProcessId(hwnd, &pid);
+ if(pid != screenshot_pinfo.pi.dwProcessId)
+ return TRUE;
+
+ if(!IsWindowVisible(hwnd))
+ return TRUE;
+
+ prefix = (char*)lparam;
+ len = SDL_strlen(prefix) + 100;
+ filename = (char*)SDL_malloc(len * sizeof(char));
+ if(!filename)
+ {
+ SDLTest_LogError("malloc() failed");
+ return FALSE;
+ }
+
+ /* restore the window and bring it to the top */
+ ShowWindowAsync(hwnd, SW_RESTORE);
+ /* restore is not instantaneous */
+ SDL_Delay(500);
+
+ /* take a screenshot of the client area */
+ if(img_num == 1)
+ SDL_snprintf(filename, len, "%s.bmp", prefix);
+ else
+ SDL_snprintf(filename, len, "%s_%d.bmp", prefix, img_num);
+ img_num++;
+ ScreenshotWindow(hwnd, filename, SDL_TRUE);
+
+ SDL_free(filename);
+ return TRUE;
+}
+
+
+/* each window of the process will have a screenshot taken. The file name will be
+ prefix-i.png for the i'th window. */
+int
+SDLVisualTest_ScreenshotProcess(SDL_ProcessInfo* pinfo, char* prefix)
+{
+ if(!pinfo)
+ {
+ SDLTest_LogError("pinfo argument cannot be NULL");
+ return 0;
+ }
+ if(!prefix)
+ {
+ SDLTest_LogError("prefix argument cannot be NULL");
+ return 0;
+ }
+
+ img_num = 1;
+ screenshot_pinfo = *pinfo;
+ if(!EnumWindows(ScreenshotHwnd, (LPARAM)prefix))
+ {
+ SDLTest_LogError("EnumWindows() failed");
+ return 0;
+ }
+
+ return 1;
+}
+
+#endif
diff --git a/visualtest/stamp-h1 b/visualtest/stamp-h1
new file mode 100755
index 000000000..4547fe1b5
--- /dev/null
+++ b/visualtest/stamp-h1
@@ -0,0 +1 @@
+timestamp for config.h
diff --git a/visualtest/testsprite2_sample.actions b/visualtest/testsprite2_sample.actions
new file mode 100755
index 000000000..c0e9ab8b9
--- /dev/null
+++ b/visualtest/testsprite2_sample.actions
@@ -0,0 +1,3 @@
+00:00:02 SCREENSHOT # Take a screenshot of each window owned by the SUT process
+00:00:05 VERIFY # Verify each screenshot taken with verification images
+00:00:10 QUIT # Gracefully quit the SUT process
\ No newline at end of file
diff --git a/visualtest/testsprite2_sample.config b/visualtest/testsprite2_sample.config
new file mode 100755
index 000000000..14eb4622c
--- /dev/null
+++ b/visualtest/testsprite2_sample.config
@@ -0,0 +1,6 @@
+parameter-config=testsprite2_sample.parameters
+num-variations=10
+variator=random
+sutapp=testsprite2
+timeout=00:00:20
+action-config=testsprite2_sample.actions
\ No newline at end of file
diff --git a/visualtest/testsprite2_sample.parameters b/visualtest/testsprite2_sample.parameters
new file mode 100755
index 000000000..29e34cd28
--- /dev/null
+++ b/visualtest/testsprite2_sample.parameters
@@ -0,0 +1,29 @@
+# parameter name, type, value range, required, categories
+--gldebug, boolean, [], false, []
+--info, enum, [all video modes render event], false, []
+--log, enum, [all error system audio video render input], false, []
+--display, integer, [1 5], false, []
+--fullscreen, boolean, [], false, []
+--fullscreen-desktop, boolean, [], false, []
+# --windows, integer, [1 5], false, [] # this option is not supported yet
+--title, enum, [vartest bartest footest], false, []
+--icon, enum, [icon.bmp], false, []
+--center, boolean, [], false, []
+--position, enum, [300,300], false, []
+--geometry, enum, [500x500], false, []
+--min-geometry, enum, [100x100], false, []
+--max-geometry, enum, [600x600 700x700], false, []
+--logical, enum, [500x500 550x450], false, []
+--scale, integer, [1 5], false, []
+--depth, integer, [1 5], false, []
+--refresh, integer, [1 5], false, []
+--vsync, boolean, [], false, []
+--noframe, boolean, [], false, []
+--resize, boolean, [], false, []
+--minimize, boolean, [], false, []
+--maximize, boolean, [], false, []
+--grab, boolean, [], false, [mouse]
+--blend, enum, [none blend add mod], false, []
+--cyclecolor, boolean, [], false, []
+--cyclealpha, boolean, [], false, []
+--iterations, integer, [10 100], false, []
\ No newline at end of file
diff --git a/visualtest/unittest/testquit.actions b/visualtest/unittest/testquit.actions
new file mode 100755
index 000000000..fa6880520
--- /dev/null
+++ b/visualtest/unittest/testquit.actions
@@ -0,0 +1 @@
+00:00:05 QUIT
\ No newline at end of file
diff --git a/visualtest/unittest/testquit.c b/visualtest/unittest/testquit.c
new file mode 100755
index 000000000..ceb83b0aa
--- /dev/null
+++ b/visualtest/unittest/testquit.c
@@ -0,0 +1,101 @@
+/*
+ Copyright (C) 2013 Apoorv Upreti
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely.
+*/
+/* Quits, hangs or crashes based on the command line options passed. */
+
+#include
+#include
+
+static SDLTest_CommonState *state;
+static int exit_code;
+static SDL_bool hang;
+static SDL_bool crash;
+
+int
+main(int argc, char** argv)
+{
+ int i, done;
+ SDL_Event event;
+
+ state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
+ if(!state)
+ return 1;
+
+ state->window_flags |= SDL_WINDOW_RESIZABLE;
+
+ exit_code = 0;
+ hang = SDL_FALSE;
+ crash = SDL_FALSE;
+
+ for(i = 1; i < argc; )
+ {
+ int consumed;
+ consumed = SDLTest_CommonArg(state, i);
+ if(consumed == 0)
+ {
+ consumed = -1;
+ if(SDL_strcasecmp(argv[i], "--exit-code") == 0)
+ {
+ if(argv[i + 1])
+ {
+ exit_code = SDL_atoi(argv[i + 1]);
+ consumed = 2;
+ }
+ }
+ else if(SDL_strcasecmp(argv[i], "--hang") == 0)
+ {
+ hang = SDL_TRUE;
+ consumed = 1;
+ }
+ else if(SDL_strcasecmp(argv[i], "--crash") == 0)
+ {
+ crash = SDL_TRUE;
+ consumed = 1;
+ }
+ }
+
+ if(consumed < 0)
+ {
+ SDLTest_Log("Usage: %s %s [--exit-code N] [--crash] [--hang]", argv[0], SDLTest_CommonUsage(state));
+ SDLTest_CommonQuit(state);
+ return 1;
+ }
+ i += consumed;
+ }
+
+ if(!SDLTest_CommonInit(state))
+ {
+ SDLTest_CommonQuit(state);
+ return 1;
+ }
+
+ /* infinite loop to hang the process */
+ while(hang)
+ SDL_Delay(10);
+
+ /* dereference NULL pointer to crash process */
+ if(crash)
+ {
+ int* p = NULL;
+ *p = 5;
+ }
+
+ /* event loop */
+ done = 0;
+ while(!done)
+ {
+ while(SDL_PollEvent(&event))
+ SDLTest_CommonEvent(state, &event, &done);
+ SDL_Delay(10);
+ }
+
+ return exit_code;
+}
\ No newline at end of file
diff --git a/visualtest/unittest/testquit.config b/visualtest/unittest/testquit.config
new file mode 100755
index 000000000..756dec8ac
--- /dev/null
+++ b/visualtest/unittest/testquit.config
@@ -0,0 +1,5 @@
+sutconfig=testquit.parameters
+action-config=testquit.actions
+variator=exhaustive
+sutapp=testquit
+timeout=00:00:10
\ No newline at end of file
diff --git a/visualtest/unittest/testquit.parameters b/visualtest/unittest/testquit.parameters
new file mode 100755
index 000000000..6e5887ce5
--- /dev/null
+++ b/visualtest/unittest/testquit.parameters
@@ -0,0 +1,3 @@
+--exit-code, integer, [-1 1], false, [] # The exit code returned by the executable
+--crash, boolean, [], false, [] # Crashes the SUT executable
+--hang, boolean, [], false, [] # Runs the SUT in the infinite loop and ignores all events
\ No newline at end of file