<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Andrew Stopford&amp;#39;s Weblog</title><subtitle type="html">poobah</subtitle><id>http://weblogs.asp.net/astopford/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/astopford/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2008-08-05T17:32:00Z</updated><entry><title>DDD voting opens</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/09/04/ddd-voting-opens.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/09/04/ddd-voting-opens.aspx</id><published>2008-09-04T11:52:00Z</published><updated>2008-09-04T11:52:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;&lt;A class="" href="http://www.developerday.co.uk/ddd/votesessions.asp" mce_href="http://www.developerday.co.uk/ddd/votesessions.asp"&gt;The voting for DDD opened yesterday&lt;/A&gt;, my submission is listed and do give it some thought if you are planning on attending. I've given a MbUnit session here in Manchester first at AgileNorth last year and again last week at the ThoughtWorks geek night, I'd love to bring the session to a wider UK audience and show you what MbUnit can do. I am up against loads of great sessions (all of which I want to see) so picking the sessions you want to see will be really tricky, hopefully this years event will get lots of space or more days (DDD weekender?).&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6598797" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /></entry><entry><title>RedGate and the Parrot</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/09/03/redgate-and-the-parrot.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/09/03/redgate-and-the-parrot.aspx</id><published>2008-09-03T09:31:00Z</published><updated>2008-09-03T09:31:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;Made me smile.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/astopford/ANTS%20Performance%20Profiler%204%20Beta%20Program.png" mce_src="http://weblogs.asp.net/blogs/astopford/ANTS%20Performance%20Profiler%204%20Beta%20Program.png"&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6594878" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author></entry><entry><title>Mini IOC and Static gateway logging</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/09/01/mini-ioc-and-static-gateway-logging.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/09/01/mini-ioc-and-static-gateway-logging.aspx</id><published>2008-09-01T16:55:00Z</published><updated>2008-09-01T16:55:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;DI (IOC) containers are a powerful tools,&amp;nbsp;the reasons why you would and would not use one I will leave to your better judgement.&amp;nbsp;Which one you would use I will also leave to your judgement, however if you need a light weight, build in IOC then one of the best examples I have seen (and used) is &lt;A class="" href="http://www.kenegozi.com/Blog/2008/01/17/its-my-turn-to-build-an-ioc-container-in-15-minutes-and-33-lines.aspx" mce_href="http://www.kenegozi.com/Blog/2008/01/17/its-my-turn-to-build-an-ioc-container-in-15-minutes-and-33-lines.aspx"&gt;Ken's 33 line Mini IOC&lt;/A&gt;. It is simple to use and simple to implement&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;IOC.Register&amp;lt;IShipping, MyShipping&amp;gt;();        &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;IOC.Register&amp;lt;IBasket, MyBasket&amp;gt;();        &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;IOC.Register&amp;lt;IView, MyView&amp;gt;();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;var bank = IOC.Resolve&amp;lt;IPresenter&amp;gt;();&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;logging is a little tricky, to the rescue comes JB's &lt;A class="" href="http://blog.jpboodhoo.com/TheStaticGatewayPattern.aspx" mce_href="http://blog.jpboodhoo.com/TheStaticGatewayPattern.aspx"&gt;static gateway&lt;/A&gt; &lt;A class="" href="http://blog.jpboodhoo.com/StaticGatewayPart2.aspx" mce_href="http://blog.jpboodhoo.com/StaticGatewayPart2.aspx"&gt;logging example&lt;/A&gt;. This is a neat solution to the problem as we now use IOC to resolve a logging class dependency, so first we need to create a dependency class for our mini&amp;nbsp;IOC.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; IOCResolver : IDependencyResolver&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Interface GetImplementationOf&amp;lt;Interface&amp;gt;()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; IOC.Resolve&amp;lt;Interface&amp;gt;();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;Next we need a logging class Factory&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; DebugLogFactory : ILogFactory&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ILog CreateFor(Type type)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; DebugLogger();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;and the logging class&amp;nbsp;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; 
&lt;P mce_keep="true"&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;     &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; DebugLogger : ILog&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Debug(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; message)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;            {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;               System.Diagnostics.Debug.WriteLine(&lt;SPAN class=str&gt;"DEBUG: "&lt;/SPAN&gt; + message);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;            }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Warning(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; message)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;            {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;                System.Diagnostics.Debug.WriteLine(&lt;SPAN class=str&gt;"WARNING: "&lt;/SPAN&gt; + message);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;            }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Fail(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; message)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;            {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;                System.Diagnostics.Debug.WriteLine(&lt;SPAN class=str&gt;"FAIL: "&lt;/SPAN&gt; + message);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;            }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;Now we have our various parts we first set up the Resolver which then goes looking in the IOC for our logging Factory (thus we also need to add our logging Factory to the IOC), all in all we end up with&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;DependencyResolver.InitializeWith(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; IOCResolver());&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;IOC.Register&amp;lt;ILogFactory, DebugLogFactory&amp;gt;();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;IOC.Register&amp;lt;IShipping, MyShipping&amp;gt;();        &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;IOC.Register&amp;lt;IBasket, MyBasket&amp;gt;();        &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;IOC.Register&amp;lt;IView, MyView&amp;gt;();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;var bank = IOC.Resolve&amp;lt;IPresenter&amp;gt;();&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;now we can log simply by using&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;Log.For(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;).Debug(&lt;SPAN class=str&gt;"testing"&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;/DIV&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6591576" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /></entry><entry><title>MbUnit Combinatorial Test</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/29/mbunit-combinatorial-test.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/29/mbunit-combinatorial-test.aspx</id><published>2008-08-29T20:41:00Z</published><updated>2008-08-29T20:41:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;I presented MbUnit at the Manchester ThoughtWorks geek night last Wednesday, it was a great night with lots of great questions and feedback.&amp;nbsp;It was really great&amp;nbsp;meeting folks who use MbUnit day to day, it really validates the work we do on the project.&amp;nbsp;I think for DDD I'll change the format of my talk as I have now started thinking about a story format for the session, voting for that is due to close soon so we shall see.&amp;nbsp; The next post in the MbUnit series will be about the combinatorial test.&amp;nbsp;Let's take a look at the object under test first.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Starting with the interface&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;interface&lt;/SPAN&gt; IAlphaString&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; ValidString(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; inputString);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;and now the concrete class&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Text.RegularExpressions;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; AlphaString : IAlphaString&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; ValidString(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; inputString)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;    {      &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        Regex r = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Regex(&lt;SPAN class=str&gt;"[a-zA-Z]"&lt;/SPAN&gt;, RegexOptions.None);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; r.IsMatch(inputString);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;This class tests for alpha strings and returns false if the test fails, true if the test passes. Before we get into testing this class we need one more class&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; StringHolder&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; StringValue;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; IsValid;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; StringHolder(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; stringvalue, &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; isValid)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        StringValue = stringvalue;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        IsValid = isValid;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; ToString()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; String.Format(&lt;SPAN class=str&gt;"{0},{1}"&lt;/SPAN&gt;, StringValue, IsValid);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;This class allows to set a test value and expected result. Wiring this object to the object under test we do the following.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Collections;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; MbUnit.Framework;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;[TestFixture]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; IAlphaStringTest&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    [Factory(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(IAlphaString))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; IEnumerable AlphaStringInstances()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;yield&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; AlphaString();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;    [Factory(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(StringHolder))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; IEnumerable TestStrings()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;yield&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; StringHolder(&lt;SPAN class=str&gt;"aaaa"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;yield&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; StringHolder(&lt;SPAN class=str&gt;"111"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;    [CombinatorialTest]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; AlphaValuesTest([UsingFactories(&lt;SPAN class=str&gt;"TestStrings"&lt;/SPAN&gt;)] StringHolder testValues,&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;                                [UsingFactories(&lt;SPAN class=str&gt;"AlphaStringInstances"&lt;/SPAN&gt;)] IAlphaString itemstoTest)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;        Assert.AreEqual(itemstoTest.ValidString(testValues.StringValue), testValues.IsValid);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;First we deploy the MbUnit factory attribute to have a referance to object under test and test holder object(s), we then link the factories into the actual test. The end result is that for each test value\expected result pair we run the test value against the obect under test and compare the expected result to the actual result. Let's take a look at v3 version&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Collections.Generic;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; MbUnit.Framework;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;[TestFixture]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; CombinatorialTest&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; IEnumerable&amp;lt;IAlphaString&amp;gt; GetInstances()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;yield&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; AlphaString();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;    &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;    [Test]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;    [Row(&lt;SPAN class=str&gt;"aaaa"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;    [Row(&lt;SPAN class=str&gt;"111"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Test(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; isValid, [Factory(&lt;SPAN class=str&gt;"GetInstances"&lt;/SPAN&gt;)] IAlphaString alphaString)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        Assert.AreEqual(isValid, alphaString.ValidString(&lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;));&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;V3 makes things simpler in that we no longer need a test holder object and instead we can pair the test value\expected result to the object under test within the row test.&amp;nbsp;As I am hopefully showing we are taking the long standing row fixture to the level in v3.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6577110" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term="MbUnit" scheme="http://weblogs.asp.net/astopford/archive/tags/MbUnit/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /></entry><entry><title>MbUnit Factory</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/26/mbunit-factory.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/26/mbunit-factory.aspx</id><published>2008-08-26T22:23:00Z</published><updated>2008-08-26T22:23:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;Factories in MbUnit work in much the same way in v2 (where they have been available since the start) and v3, in v2 we would use a Factory as follows.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;using System.Collections;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;using MbUnit.Framework;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ArrayListFactory&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;    [Factory]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ArrayList ProviderEmptyArrayList&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;get&lt;/SPAN&gt; { &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArrayList(); }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;    [Factory]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ArrayList ProviderArrayList&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;get&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;            ArrayList list = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArrayList();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;            list.Add(0);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;            list.Add(1);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; list;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;As seen in the TypeFixture example this marks methods as Factory functions that can be reused across tests, for example by a ProviderFactory marked test etc. They are useful way of decorating methods as data providers rather than test methods. Let's look at a v3 example.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;using System;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;using System.Collections;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;using MbUnit.Framework;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;[TestFixture]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; FactoryTest&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ArrayList ProviderArrayList&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;get&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;            var list = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArrayList { 1, 2 };&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; list;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;    [Test]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;    [Factory(&lt;SPAN class=str&gt;"ProviderArrayList"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; void Test (int value)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;        Assert.GreaterThan(value, 0);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;MbUnit v3 Factory attributes work differently here in that we mark a given method as a Factory by marking it's given name rather than decorating the actual method, on this example we mark the ProviderArrayList method as a Factory method but&amp;nbsp;decorate our Test method instead.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6569478" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term="MbUnit" scheme="http://weblogs.asp.net/astopford/archive/tags/MbUnit/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /></entry><entry><title>Agile has the answers?</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/26/agile-has-the-answers.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/26/agile-has-the-answers.aspx</id><published>2008-08-26T18:22:00Z</published><updated>2008-08-26T18:22:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;Some software approaches run in cycles&lt;/P&gt;
&lt;P mce_keep="true"&gt;Gather requirements (sometimes)&lt;BR&gt;Write Code&lt;BR&gt;Test code (sometimes)&lt;/P&gt;
&lt;P mce_keep="true"&gt;Get the requirements wrong and the requirements change midway through writing the code and your writing more code or changing code and the time scale goes up (yes even if the deadline is unmoveable the coders still have to work more hours). Worse yet they change at the testing level and it means more code and yet more testing. Expensive and time consuming when you could use all that to deliver sooner and more to your customer.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Let’s say the cycle takes 6 weeks, 2 weeks in each stage. On week 3 the customer asks you where you are and you either make them wait 2 weeks more or give them an incomplete version. They then ask for this, that and other, with the need to gather further requirements, write more code\change code the cycle is looking longer and longer and the customer is still not seeing what they asked for (and keeps changing their mind). Sounds like scope-creep sure enough but if the customer is not getting what they asked for are you delivering and will they keep paying you? Requirements sign off can help but will the customer agree and be happy that what they signing off is what they asked for (and keep paying you for it). They may have agreed to Black but they ment #001. &lt;/P&gt;
&lt;P mce_keep="true"&gt;Agile has the answer though....&lt;/P&gt;
&lt;P mce_keep="true"&gt;No one has yet said that Agile will save the day and our industry will be bright and wonderful, some agree that Agile works for some things but not others aka &lt;A class="" href="http://littletutorials.com/2008/06/24/the-agile-800-pounds-gorilla/" mce_href="http://littletutorials.com/2008/06/24/the-agile-800-pounds-gorilla/"&gt;THE ENTERPRISE&lt;/A&gt;. &lt;/P&gt;
&lt;P mce_keep="true"&gt;I don't personally agree as Agile is not any one thing, it is just a another way of doing things and if you have the foundations right you can adapt it your team\business etc. I don't have all the answers, if you write widgets that control the flow of ear wax in a 3D human head sim can't say what you will need to do. Only YOU can answer that question, you do the job, you know what works and want doesn’t but to cast Agile aside for less than serious reasons will keep you on the same late\failed\expensive project path. &lt;/P&gt;
&lt;P mce_keep="true"&gt;Agile was not dreamed up by a collection of goofy nerds but was a collection of ideas from a group of people who had spent decades in the industry and created the concepts from those same decades spent on software projects (and seeing why projects failed). &lt;/P&gt;
&lt;P mce_keep="true"&gt;Agile does fail too though, lots of stories about failed Agile projects with reasons ranging from incomplete\unworkable adapted Agile process through to failing to understand\follow Agile concepts. If you’re serious about it, hire an Agile coach, sure some cost the GNP of a small nation but they are worth their weight in gold in using their experience and skills to help you adapt and follow Agile processes.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Have you adopted agile, what worked\failed for you?&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6568642" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/astopford/archive/tags/General+Software+Development/default.aspx" /><category term="Agile" scheme="http://weblogs.asp.net/astopford/archive/tags/Agile/default.aspx" /></entry><entry><title>Software Estimation is hard (right)?</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/26/software-estimation-is-hard-right.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/26/software-estimation-is-hard-right.aspx</id><published>2008-08-26T18:03:00Z</published><updated>2008-08-26T18:03:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;&lt;A class="" href="http://www.woodwardweb.com/programming/000439.html" mce_href="http://www.woodwardweb.com/programming/000439.html"&gt;Martin Woodward has a great article on software estimation, why it is hard and what Agile brings to the table&lt;/A&gt;. The approach I have seen the most in the past is the grand old FITA analysis (Finger in The Air) estimate. Get it right and your on time, get it wrong all hell breaks loose (most of which cost money e.g the cost of late delivery, the cost of extra development etc). If the coders finish early then chances are Parkinsons law applies and still costs you.&amp;nbsp; Projects even fail completely or the customer walks away never to be seen again, software estimation should be science and not an art, but that's what it is. &lt;/P&gt;
&lt;P mce_keep="true"&gt;If you have not read the &lt;A class="" href="http://www.mountaingoatsoftware.com/book/1" mce_href="http://www.mountaingoatsoftware.com/book/1"&gt;Agile Planning and Estimation book&lt;/A&gt; then you should, much of what I am going to talk about here is distilled from &lt;A class="" href="http://blog.mountaingoatsoftware.com/" mce_href="http://blog.mountaingoatsoftware.com/"&gt;Mike Cohns&lt;/A&gt; book and is an&amp;nbsp;invaluable read.&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Activity based planning (gantt chart) folds in several tasks into a single activity e.g&lt;/P&gt;
&lt;P mce_keep="true"&gt;create new shopping basket &lt;/P&gt;
&lt;P mce_keep="true"&gt;A block of time is then set for that activity, FITA 4 days. There are many things wrong with this, the customer won't see any progression in those steps e.g.&lt;/P&gt;
&lt;P mce_keep="true"&gt;create visual layout for basket&lt;BR&gt;create add functionality&lt;BR&gt;create edit\delete functionality&lt;BR&gt;create summary &lt;/P&gt;
&lt;P mce_keep="true"&gt;If the customer sees progression they will be happy with what they are getting and most criticially by breaking down the task into features you can estimate better.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Let's rank these first by what the customer wants to see first from 1-5, the customer may rank them all at 5 but only 1 feature can be ranked high.&lt;/P&gt;
&lt;P mce_keep="true"&gt;5 create visual layout for basket&lt;BR&gt;4 mcreate add functionality&lt;BR&gt;4 create edit\delete functionality&lt;BR&gt;3 create summary &lt;/P&gt;
&lt;P mce_keep="true"&gt;In the first pass we know what the customer wants to see right away "create visual layout for basket". Agile works in time blocks (called iterations) these provide a set block of time so that everything is not done all at once, the customer can see progress and can ask for changes but at the end of iteration, you set how long each one is but they are intended to be short, 1 week at best. For a given week therefore we know anything we do can be no longer than a week (if so it may need further breaking down).&lt;/P&gt;
&lt;P mce_keep="true"&gt;For each feature we do a certain amount of FITA (or any other approach you like) but with it broken down we try to base it on work we have done before on previous projects or iterations. Again we score based on time, &lt;/P&gt;
&lt;P mce_keep="true"&gt;7 days 1&lt;BR&gt;6 days 2&lt;BR&gt;5 days 3&lt;BR&gt;4 days 4&lt;BR&gt;3 days 5&lt;BR&gt;2 days 6&lt;BR&gt;1 days 7&lt;/P&gt;
&lt;P mce_keep="true"&gt;which gives us&lt;/P&gt;
&lt;P mce_keep="true"&gt;6 create visual layout for basket&lt;BR&gt;7 mcreate add functionality&lt;BR&gt;7 create edit\delete functionality&lt;BR&gt;7 create summary &lt;/P&gt;
&lt;P mce_keep="true"&gt;Which gives us 5 days in total, a day longer than our first FITA approach (you may be thinking why the task takes a day longer, if 4 days is inaccruate then either the developers will work 2 days in 1 day to meet that deadline or the 4 days you give the customer will turn into the actual 5 days it takes). If we match these up to what our customer wants to see we know what we will deliver to them in that iteration by adding up the scores.&lt;/P&gt;
&lt;P mce_keep="true"&gt;11 create visual layout for basket&lt;BR&gt;11 mcreate add functionality&lt;BR&gt;11 create edit\delete functionality&lt;BR&gt;10 create summary &lt;/P&gt;
&lt;P mce_keep="true"&gt;In the 7 day block we can deliver to the customer with 2 days to go. If the iteration was shortend (assuming other feature planning allows) to 5 days then the we can still deliver. Let's assume that the customer wants to see something in 4 days (again assumming other features allow) then you could still deliver the features they rank as important but the lesser important features slip to the next iteration, if the customer wants that feature then either the iteration remains at 5 days or the feature moves to the next iteration (which could be shorter still).&lt;/P&gt;
&lt;P mce_keep="true"&gt;Your still guessing time for functionality though?&lt;/P&gt;
&lt;P mce_keep="true"&gt;Yes you are but by being broken down into smaller tasks you can far more easily base them on previous tasks that may be associated to the task in question. If your guess is wrong and the task takes longer or is completed faster then you can adjust the task for next time. Looping in members of the team also makes the difference here, Agile involves the whole team in the planning experience and you should draw on their experince for how long features may take, &lt;A class="" href="http://www.planningpoker.com/detail.html" mce_href="http://www.planningpoker.com/detail.html"&gt;planning poker&lt;/A&gt; can also help here.&lt;/P&gt;
&lt;P mce_keep="true"&gt;How do you estimate software timescales, what works for you?&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6568600" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/astopford/archive/tags/General+Software+Development/default.aspx" /><category term="Agile" scheme="http://weblogs.asp.net/astopford/archive/tags/Agile/default.aspx" /></entry><entry><title>MbUnit RowTest</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/25/mbunit-rowtest.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/25/mbunit-rowtest.aspx</id><published>2008-08-25T22:02:00Z</published><updated>2008-08-25T22:02:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;"You said no RowTest post!"&lt;/P&gt;
&lt;P mce_keep="true"&gt;I know I did&amp;nbsp;but&amp;nbsp;this v3 feature I'd like to talk about, Row value headers, let's look at this example.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    [Test]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    [Row(1, 3, &lt;SPAN class=str&gt;"test"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;    [Row(2, 2, &lt;SPAN class=str&gt;"test"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Example(&lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; sum1, &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; sum2, &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        Assert.AreEqual(4, sum1 + sum2);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;Here we have a row test with sample values (note you can mix types in this way) which seeds the test, so far so not unusual, let's try this however.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    [Test]  &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    [Row(1, 3, &lt;SPAN class=str&gt;"test"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;    [Row(2, 2, &lt;SPAN class=str&gt;"test"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Example(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; sum1, &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; sum2)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        Assert.AreEqual(4, sum1 + sum2);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;This test would fail as the Row seeds the test parameters in the order they are set in the Row, so now the string values are seeded with int values. While we could just set the parameters in the right order we can also do the following.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    [Test]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    [Header(&lt;SPAN class=str&gt;"sum1"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"sum2"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"value"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;    [Row(1, 3, &lt;SPAN class=str&gt;"test"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;    [Row(2, 2, &lt;SPAN class=str&gt;"test"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Example(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; sum1, &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; sum2)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        Assert.AreEqual(4, sum1 + sum2);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;Same test parameter order as before but the test passes. The reason is the Header attribute, this states to MbUnit how each row test value relates to the test parameters so rather than change our test method we can instead fine tune the test data instead.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6564937" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term="MbUnit" scheme="http://weblogs.asp.net/astopford/archive/tags/MbUnit/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /></entry><entry><title>MbUnit TypeFixture</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/25/mbunit-typefixture.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/25/mbunit-typefixture.aspx</id><published>2008-08-25T19:41:00Z</published><updated>2008-08-25T19:41:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;This is the first of series of posts I'll be running on MbUnit, I'll focus on v2 first and then show an example in v3. I won't focus on RowTest as this is a popular feature and is well known both by the MbUnit audience and by other frameworks. For the opening post&amp;nbsp;I'll focus on the TypeFixture, let's take a look at the code.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Collections;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; MbUnit.Framework;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;[TypeFixture(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(IEnumerable))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; TypeFixtureExample&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    [Provider(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(IEnumerable))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ArrayList ProviderEmptyArrayList()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArrayList();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;    &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;    [Provider(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(IEnumerable))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ArrayList ProviderArrayList()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        ArrayList list = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArrayList();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        list.Add(0);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;        list.Add(1);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; list;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;    [Test]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;    [ExpectedException(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(InvalidOperationException))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; CurrentCalledBeforeMoveNext(IEnumerable en)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;          IEnumerator  er = en.GetEnumerator(); &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;          &lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; p = er.Current;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;    [Test]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  32:  &lt;/SPAN&gt;    [ExpectedException(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(InvalidOperationException))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  33:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; CurrentCalledAfterFinishedMoveNext(IEnumerable en)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  34:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  35:  &lt;/SPAN&gt;        IEnumerator er = en.GetEnumerator();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  36:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt; (er.MoveNext());&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  37:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; p = er.Current;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  38:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  39:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;We have two tests that will run&amp;nbsp;on both methods that are decorated by the Provider attribute, each provider set's up an ArrayList as our target type and each test runs against both providers. Each provider seeds the test method, you could also define one provider as your target type and any number of tests against that provider. If you want to break&amp;nbsp;up your tests&amp;nbsp;into reusable parts&amp;nbsp;then you could do the following.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Collections;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; MbUnit.Framework;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ArrayListFactory&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;    [Factory]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ArrayList ProviderEmptyArrayList&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        get { &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArrayList(); }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;    [Factory]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ArrayList ProviderArrayList&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;        get&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;            ArrayList list = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArrayList();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;            list.Add(0);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;            list.Add(1);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; list;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;and use these as follows&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Collections;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; MbUnit.Framework;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;[TypeFixture(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(IEnumerable))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;[ProviderFactory(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(ArrayListFactory), &lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(IEnumerable))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ProviderFactoryTest&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    [Test]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;    [ExpectedException(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(InvalidOperationException))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; CurrentCalledBeforeMoveNext(IEnumerable en)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;        IEnumerator er = en.GetEnumerator();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; p = er.Current;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;    [Test]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;    [ExpectedException(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(InvalidOperationException))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; CurrentCalledAfterFinishedMoveNext(IEnumerable en)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;        IEnumerator er = en.GetEnumerator();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt; (er.MoveNext()) ;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; p = er.Current;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;Here we break out the providers into Factories and referance them in our test using the ProviderFactory attribute. So unlike our first test the Providers are isolated from the test and reusable across other tests however we can still seed our tests as before. &lt;/P&gt;
&lt;P mce_keep="true"&gt;Let's take a look at how MbUnit v3 does this.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Collections.Generic;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; MbUnit.Framework;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; TypeFixtureExample&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; IEnumerable&amp;lt;IEnumerable&amp;gt; GetInstances()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;yield&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArrayList();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;yield&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArrayList { 0, 1 };&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;    [Factory(&lt;SPAN class=str&gt;"GetInstances"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; IEnumerable Instance;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;    [Test]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;    [ExpectedException(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(InvalidOperationException))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; CurrentCalledBeforeMoveNext()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;        var er = Instance.GetEnumerator();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        var p = er.Current;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;    [Test]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;    [ExpectedException(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(InvalidOperationException))]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; CurrentCalledAfterFinishedMoveNext()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;        var er = Instance.GetEnumerator();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt; (er.MoveNext()) ;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;        var p = er.Current;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;} &lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;V3 has done away with the Provider attribute, we use Factory attributes as before but no longer need the ProviderFactory attribute as&amp;nbsp;v3 is a little cleverer&amp;nbsp;at wiring up tthe data. &amp;nbsp;Our type tester methods remain the same however we seed them using the Factory attribute, this like the v2 attribute will create and hold test data for us. In this example the Factory attribute creates a enumerable list of our type along with seeded data. The GetInstances method plays the role of the Provider methods in the v2 example, we are using some 3.5 sugar to shorten the syntax here but the principle of seeded types remains the same.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6564886" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term="MbUnit" scheme="http://weblogs.asp.net/astopford/archive/tags/MbUnit/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /></entry><entry><title>ThoughtWorks geek night - reminder</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/25/thoughtworks-geek-night-reminder.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/25/thoughtworks-geek-night-reminder.aspx</id><published>2008-08-25T09:27:00Z</published><updated>2008-08-25T09:27:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;Just a quick reminder about &lt;A class="" href="http://weblogs.asp.net/astopford/archive/2008/07/31/mbunit-thoughtworks-geek-night.aspx" mce_href="http://weblogs.asp.net/astopford/archive/2008/07/31/mbunit-thoughtworks-geek-night.aspx"&gt;this Wednesday (27th) and the Manchester UK&amp;nbsp;ThoughtWorks geek night where I will be giving a session on MbUnit v2&lt;/A&gt;, I'll also be showing some MbUnit v3 and Gallio bits as well. If you have not already signed up then check out &lt;A class="" href="http://manchestergeeknights.wetpaint.com/page/Techniques+For+Producing+Quality+Software" mce_href="http://manchestergeeknights.wetpaint.com/page/Techniques+For+Producing+Quality+Software"&gt;the registration site&lt;/A&gt;.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I am&amp;nbsp;also&amp;nbsp;hoping to take&amp;nbsp;an adapted version of this&amp;nbsp;session down to DDD UK&amp;nbsp;in November.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A class="" href="http://blog.bits-in-motion.com/2008/08/how-to-find-me.html" mce_href="http://blog.bits-in-motion.com/2008/08/how-to-find-me.html"&gt;Jeff has also announced&lt;/A&gt; that he will be giving a MbUnit v3\Gallio&amp;nbsp;session at the Silcon Valley code camp (November 8th\9th) and&amp;nbsp;at QCon (November 18-21st), if your in the SF Bay area then be sure to check out his sessions.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6562824" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author></entry><entry><title>Silverlight PAL</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/21/silverlight-pal.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/21/silverlight-pal.aspx</id><published>2008-08-21T12:18:00Z</published><updated>2008-08-21T12:18:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;I started pondering about the DLR and running it on the SSCLI when I came across &lt;A class="" href="http://msdn.microsoft.com/en-us/magazine/cc721609.aspx" mce_href="http://msdn.microsoft.com/en-us/magazine/cc721609.aspx"&gt;this article on the CoreCL&lt;/A&gt;R (shared source version of that would be fun) and the following.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;EM&gt;A lot of the Silverlight PAL benefits from lessons learned when we developed the Shared Source Common Language Infrastructure (SSCLI), also known as Rotor. The SSCLI ran on a number of UNIX-style platforms as well as Windows. The base OS functionality varies widely on UNIX-style platforms. The SSCLI PAL had to work on both microkernels (such as the Mach kernel in Mac OS X) and monolithic kernels and had to cope with different OS services such as threading, exception handling, and networking stacks. Because Silverlight only targets Windows and Intel Mac machines we were able to write Mac-specific implementations for many of the functions in the PAL, which helps with the size and performance of the PAL.&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;The diagram in the article makes more sense but the CoreCLR Platform Adaption Layer (PAL)&amp;nbsp;works in the same way as Rotors in that anything Win32 related goes direct to the OS while anything else goes via the PAL. Rotors PAL targeted different chip sets and Win32, FreeBSD Unix and Mac OSX.&amp;nbsp; Free BSD and the Mac OSX are based on the same kernal&amp;nbsp;(&lt;A class="" href="http://en.wikipedia.org/wiki/Mach_kernel" mce_href="http://en.wikipedia.org/wiki/Mach_kernel"&gt;the Mach kernal&lt;/A&gt;)&amp;nbsp;so chip sets aside porting the Mac PAL to the Unix PAL was relatively stright foward. The CoreCLR PAL targets the same chip set's and only requires a small sub-set of OS functionlity which keeps the complexity of the CoreCLR's PAL down.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6546942" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term="CLR &amp;amp; Rotor" scheme="http://weblogs.asp.net/astopford/archive/tags/CLR+_2600_amp_3B00_+Rotor/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /></entry><entry><title>Rotor 2.0 reference book</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/21/rotor-2-0-referance-book.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/21/rotor-2-0-referance-book.aspx</id><published>2008-08-21T11:38:00Z</published><updated>2008-08-21T11:38:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;The SSCLI aka Rotor tends to not draw all that much attention unless your a researcher or&amp;nbsp;CLR wonk but it is one of&amp;nbsp;(if not the best)&amp;nbsp;source code referances to the very depths of&amp;nbsp;.NET that you will ever find.&amp;nbsp;For me personally getting the very most of the framemwork I develop on every day is&amp;nbsp;about expanding my understanding of how that framework works, sure the compilers and there tricks come&amp;nbsp;next but the root is the CLI.&amp;nbsp; To top it all you can compile the CLR man !!!&lt;/P&gt;
&lt;P mce_keep="true"&gt;Therefore it fills me with joy that &lt;A class="" href="http://callvirt.net/blog/entry.aspx?entryid=b9a94d0c-761a-4d6b-bc2f-d6a5f8c1a4a7" mce_href="http://callvirt.net/blog/entry.aspx?entryid=b9a94d0c-761a-4d6b-bc2f-d6a5f8c1a4a7"&gt;Joel has the news&lt;/A&gt; that along with &lt;A class="" href="http://blogs.tedneward.com/2008/08/20/Rotor+V2+Book+Draft+Available.aspx" mce_href="http://blogs.tedneward.com/2008/08/20/Rotor+V2+Book+Draft+Available.aspx"&gt;Ted (da&amp;nbsp;ThoughtWorker)&amp;nbsp;Neward&lt;/A&gt; they have re-worked the SSCLI referance book to match the SSCLI 2.0 release. Ted wrote the first draft and Joel brings his experince as a former&amp;nbsp;PM on the CLR team to this edition and it is great to see. An early draft in full is available here. I'm pleased as punch about this as I used it along side books such as &lt;A class="" href="http://www.microsoft.com/MSPress/books/6522.aspx" mce_href="http://www.microsoft.com/MSPress/books/6522.aspx"&gt;CLR via C#&lt;/A&gt;&amp;nbsp;and &lt;A class="" href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;camp=1789&amp;amp;tag=bradabramsblo-20&amp;amp;creative=9325&amp;amp;path=http://www.amazon.com/gp/product/0735619883?v=glance%26n=283155%26s=books%26v=glance" mce_href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;camp=1789&amp;amp;tag=bradabramsblo-20&amp;amp;creative=9325&amp;amp;path=http://www.amazon.com/gp/product/0735619883?v=glance%26n=283155%26s=books%26v=glance"&gt;Customizing the CLR&lt;/A&gt;.if you after more CLR books then I have &lt;A class="" href="http://weblogs.asp.net/astopford/archive/2003/12/03/40973.aspx" mce_href="http://weblogs.asp.net/astopford/archive/2003/12/03/40973.aspx"&gt;an old (from 2003)&amp;nbsp;list here&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6546828" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term="CLR &amp;amp; Rotor" scheme="http://weblogs.asp.net/astopford/archive/tags/CLR+_2600_amp_3B00_+Rotor/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /></entry><entry><title>A  WPF taskboard for Scrum\VSTS</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/11/a-wpf-taskboard-for-scrum-vsts.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/11/a-wpf-taskboard-for-scrum-vsts.aspx</id><published>2008-08-11T22:42:00Z</published><updated>2008-08-11T22:42:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;Conchango develop &lt;A class="" href="http://www.scrumforteamsystem.com/en/default.aspx" mce_href="http://www.scrumforteamsystem.com/en/default.aspx"&gt;a free add-in for VSTS that enables Scrum&lt;/A&gt;, they have recently added &lt;A class="" href="http://www.scrumforteamsystem.com/en/TaskBoardBeta/Default.aspx" mce_href="http://www.scrumforteamsystem.com/en/TaskBoardBeta/Default.aspx"&gt;a WPF planning board that I really like&lt;/A&gt;. It reminds me a little of the &lt;A class="" href="http://studios.thoughtworks.com/mingle-hidden/mingle-for-scrum-development" mce_href="http://studios.thoughtworks.com/mingle-hidden/mingle-for-scrum-development"&gt;Mingle planning wall&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6506172" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /><category term="WPF" scheme="http://weblogs.asp.net/astopford/archive/tags/WPF/default.aspx" /></entry><entry><title>Write your own NUnit constraint (in VB) - Part 2</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/06/a.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/06/a.aspx</id><published>2008-08-06T11:35:00Z</published><updated>2008-08-06T11:35:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;So in part 1 we created our own constraint and want some of that syntax sugar, the Is helper class uses static (shared) methods to create the constraints so we either&amp;nbsp; hack the NUnit source or try something else. What I ended up doing may not be ideal as it &lt;STRONG&gt;really plays&lt;/STRONG&gt; with the syntax but it was fun all the same :) I created a new class called This and did the following.&lt;/P&gt;
&lt;P mce_keep="true"&gt;This is really a modfied version of the&amp;nbsp;[Is] class with our new constraint. Note that the class exposes 'Is' as it's self so we now write&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;Imports&lt;/SPAN&gt; System.Collections&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;Imports&lt;/SPAN&gt; NUnit.Framework.Constraints&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;Imports&lt;/SPAN&gt; NUnit.Framework.SyntaxHelpers&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Class&lt;/SPAN&gt; This&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Inherits&lt;/SPAN&gt; SyntaxHelper&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Shared&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;ReadOnly&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Property&lt;/SPAN&gt; [&lt;SPAN class=kwrd&gt;Is&lt;/SPAN&gt;]() &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; This&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Get&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; This()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Get&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Property&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; AssignableFrom(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expectedType &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Type) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; AssignableFromConstraint(expectedType)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; AtLeast(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expected &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; IComparable) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; GreaterThanOrEqualTo(expected)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; AtMost(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expected &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; IComparable) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; LessThanOrEqualTo(expected)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; EqualTo(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expected &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Object&lt;/SPAN&gt;) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; EqualConstraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; EqualConstraint(expected)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; EquivalentTo(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expected &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; ICollection) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; CollectionEquivalentConstraint(expected)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  32:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  33:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  34:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; GreaterThan(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expected &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; IComparable) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  35:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; GreaterThanConstraint(expected)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  36:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  37:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  38:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; GreaterThanOrEqualTo(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expected &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; IComparable) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  39:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; GreaterThanOrEqualConstraint(expected)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  40:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  41:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  42:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; InstanceOfType(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expectedType &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Type) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  43:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; InstanceOfTypeConstraint(expectedType)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  44:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  45:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  46:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; LessThan(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expected &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; IComparable) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  47:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; LessThanConstraint(expected)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  48:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  49:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  50:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; LessThanOrEqualTo(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expected &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; IComparable) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  51:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; LessThanOrEqualConstraint(expected)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  52:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  53:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  54:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; SameAs(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expected &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Object&lt;/SPAN&gt;) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  55:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; SameAsConstraint(expected)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  56:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  57:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  58:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; SubsetOf(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expected &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; ICollection) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  59:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; CollectionSubsetConstraint(expected)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  60:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  61:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  62:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; [&lt;SPAN class=kwrd&gt;TypeOf&lt;/SPAN&gt;](&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; expectedType &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Type) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  63:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; ExactTypeConstraint(expectedType)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  64:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  65:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  66:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  67:  &lt;/SPAN&gt;    &lt;SPAN class=rem&gt;' Fields&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  68:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;ReadOnly&lt;/SPAN&gt; Empty &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint = &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; EmptyConstraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  69:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;ReadOnly&lt;/SPAN&gt; [&lt;SPAN class=kwrd&gt;False&lt;/SPAN&gt;] &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint = &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; EqualConstraint(&lt;SPAN class=kwrd&gt;False&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  70:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;ReadOnly&lt;/SPAN&gt; NaN &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint = &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; EqualConstraint(NaN)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  71:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;ReadOnly&lt;/SPAN&gt; [Null] &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint = &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; EqualConstraint(&lt;SPAN class=kwrd&gt;Nothing&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  72:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;ReadOnly&lt;/SPAN&gt; [&lt;SPAN class=kwrd&gt;True&lt;/SPAN&gt;] &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint = &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; EqualConstraint(&lt;SPAN class=kwrd&gt;True&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  73:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;ReadOnly&lt;/SPAN&gt; Unique &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint = &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; UniqueItemsConstraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  74:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  75:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  76:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; DateNull() &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  77:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; DateFormatConstraint()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  78:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  79:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  80:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;ReadOnly&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Property&lt;/SPAN&gt; [Really]() &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; ConstraintBuilder&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  81:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Get&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  82:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt; ConstraintBuilder()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  83:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Get&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  84:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Property&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  85:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  86:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  87:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; Class&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;This.Is&lt;/P&gt;
&lt;P mce_keep="true"&gt;and can do&lt;/P&gt;
&lt;P mce_keep="true"&gt;This.Is.EqualTo&lt;/P&gt;
&lt;P mce_keep="true"&gt;or&amp;nbsp;use our new constraint&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;This.Is.DateNull&lt;/P&gt;
&lt;P mce_keep="true"&gt;The trouble is that the ConstraintBuilders are exposed as follows&lt;/P&gt;
&lt;P mce_keep="true"&gt;This.Not.EqualTo&lt;/P&gt;
&lt;P mce_keep="true"&gt;Which does'nt read too well, so instead we expose the builders as a&amp;nbsp;property 'Really' and we can now do&lt;/P&gt;
&lt;P mce_keep="true"&gt;This.Is.Really.Not.EqualTo&lt;/P&gt;
&lt;P mce_keep="true"&gt;To add your new constraint to a builder would mean overriding that class in the same way as the helper.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6490194" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /><category term="NUnit" scheme="http://weblogs.asp.net/astopford/archive/tags/NUnit/default.aspx" /></entry><entry><title>Write your own NUnit constraint (in VB) - Part 1</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/astopford/archive/2008/08/05/write-your-own-nunit-constraint-in-vb-part-1.aspx" /><id>http://weblogs.asp.net/astopford/archive/2008/08/05/write-your-own-nunit-constraint-in-vb-part-1.aspx</id><published>2008-08-05T16:32:00Z</published><updated>2008-08-05T16:32:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;NUnit constraints offer a different style to crafting your unit tests, rather than write.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Assert.IsEqual(&lt;EM&gt;expected,actual&lt;/EM&gt;)&lt;/P&gt;
&lt;P mce_keep="true"&gt;you could write&lt;/P&gt;
&lt;P mce_keep="true"&gt;Assert.That(&lt;EM&gt;expected&lt;/EM&gt;, Is.EqualTo(&lt;EM&gt;actual&lt;/EM&gt;))&lt;/P&gt;
&lt;P mce_keep="true"&gt;Or in VB as Is is a reserved keyword - Assert.That(&lt;EM&gt;expected&lt;/EM&gt;, [Is].EqualTo(&lt;EM&gt;actual&lt;/EM&gt;))&lt;/P&gt;
&lt;P mce_keep="true"&gt;'Is' is&amp;nbsp;one of the syntax helpers within &lt;EM&gt;NUnit.Framework.SyntaxHelpers&lt;/EM&gt; to add a little syntax sugar, the above could be written as&lt;/P&gt;
&lt;P mce_keep="true"&gt;Assert,That(expected, new&amp;nbsp;EqualConstraint(&lt;EM&gt;actual&lt;/EM&gt;))&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;Where &lt;EM&gt;EqualConstraint&lt;/EM&gt; lives in NUnit.Framework.Constraints but the syntax sugar is so much nicer.&lt;/P&gt;
&lt;P mce_keep="true"&gt;The That assert takes a &lt;EM&gt;IConstraint&lt;/EM&gt; interface and if you want to craft your own constraints you can do so by using NUnit's own &lt;EM&gt;Constraint&lt;/EM&gt; class. For our own purposes let's create a custom constraint that tests the cast of null (nothing) to a datetime value.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;Imports&lt;/SPAN&gt; NUnit.Framework&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;Imports&lt;/SPAN&gt; NUnit.Framework.Constraints&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Class&lt;/SPAN&gt; DateFormatConstraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Inherits&lt;/SPAN&gt; Constraint&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Private&lt;/SPAN&gt; testDate &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Date&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Sub&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;New&lt;/SPAN&gt;()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Me&lt;/SPAN&gt;.testDate = &lt;SPAN class=kwrd&gt;CType&lt;/SPAN&gt;(&lt;SPAN class=kwrd&gt;Nothing&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;Date&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Sub&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Overrides&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt; Matches(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; actual &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Object&lt;/SPAN&gt;) &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Boolean&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;If&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;CType&lt;/SPAN&gt;(actual, &lt;SPAN class=kwrd&gt;Date&lt;/SPAN&gt;) = &lt;SPAN class=kwrd&gt;CType&lt;/SPAN&gt;(&lt;SPAN class=kwrd&gt;Nothing&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;Date&lt;/SPAN&gt;)) &lt;SPAN class=kwrd&gt;Then&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;True&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;Else&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;Return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;False&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;If&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;Public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Overrides&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Sub&lt;/SPAN&gt; WriteDescriptionTo(&lt;SPAN class=kwrd&gt;ByVal&lt;/SPAN&gt; writer &lt;SPAN class=kwrd&gt;As&lt;/SPAN&gt; MessageWriter)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        writer.WritePredicate(&lt;SPAN class=str&gt;"Date is not null"&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;        writer.WriteExpectedValue(&lt;SPAN class=kwrd&gt;Me&lt;/SPAN&gt;.testDate)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Sub&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;End&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;Class&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;Note that the new constraint class overrides the base class &lt;EM&gt;Matches&lt;/EM&gt; and &lt;EM&gt;WriteDescription&lt;/EM&gt; methods with our own requirements.&lt;/P&gt;
&lt;P mce_keep="true"&gt;We can now use this as follows&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;Assert.That(&lt;EM&gt;expected&lt;/EM&gt;, New DateFormatConstraint())&lt;/P&gt;
&lt;P mce_keep="true"&gt;Getting this new constraint inside of Is syntax helper can be done and will be covered in part 2......&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6486749" width="1" height="1"&gt;</content><author><name>andrewstopford</name><uri>http://weblogs.asp.net/members/andrewstopford.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/astopford/archive/tags/.NET/default.aspx" /><category term="NUnit" scheme="http://weblogs.asp.net/astopford/archive/tags/NUnit/default.aspx" /></entry></feed>