Add NUnit2 files.
authorNick Drochak <nickd@mono-cvs.ximian.com>
Mon, 9 Dec 2002 14:45:05 +0000 (14:45 -0000)
committerNick Drochak <nickd@mono-cvs.ximian.com>
Mon, 9 Dec 2002 14:45:05 +0000 (14:45 -0000)
svn path=/trunk/mcs/; revision=9482

26 files changed:
mcs/nunit20/README [new file with mode: 0755]
mcs/nunit20/TestResult.xml [new file with mode: 0755]
mcs/nunit20/license.rtf [new file with mode: 0755]
mcs/nunit20/makefile [new file with mode: 0755]
mcs/nunit20/makefile.gnu [new file with mode: 0755]
mcs/nunit20/nunit-console.sln [new file with mode: 0755]
mcs/nunit20/nunit-console.suo [new file with mode: 0755]
mcs/nunit20/nunit.build [new file with mode: 0755]
mcs/nunit20/util/AssemblyInfo.cs [new file with mode: 0755]
mcs/nunit20/util/AssemblyWatcher.cs [new file with mode: 0755]
mcs/nunit20/util/CommandLineOptions.cs [new file with mode: 0755]
mcs/nunit20/util/ConsoleOptions.cs [new file with mode: 0755]
mcs/nunit20/util/FileChangedEventHandler.cs [new file with mode: 0755]
mcs/nunit20/util/GuiOptions.cs [new file with mode: 0755]
mcs/nunit20/util/NUnitRegistry.cs [new file with mode: 0755]
mcs/nunit20/util/RecentAssemblySettings.cs [new file with mode: 0755]
mcs/nunit20/util/RecentAssemblyUtil.cs [new file with mode: 0755]
mcs/nunit20/util/RegistrySettingsStorage.cs [new file with mode: 0755]
mcs/nunit20/util/SettingsGroup.cs [new file with mode: 0755]
mcs/nunit20/util/SettingsStorage.cs [new file with mode: 0755]
mcs/nunit20/util/TestEventArgs.cs [new file with mode: 0755]
mcs/nunit20/util/TestLoadEventArgs.cs [new file with mode: 0755]
mcs/nunit20/util/UIHelper.cs [new file with mode: 0755]
mcs/nunit20/util/UITestNode.cs [new file with mode: 0755]
mcs/nunit20/util/makefile.gnu [new file with mode: 0755]
mcs/nunit20/util/nunit.util.dll.csproj [new file with mode: 0755]

diff --git a/mcs/nunit20/README b/mcs/nunit20/README
new file mode 100755 (executable)
index 0000000..7e9d7d9
--- /dev/null
@@ -0,0 +1,3 @@
+
+The source for NUnit 2 was altered to work with mono. Go to www.nunit.org to get the original source code.
+
diff --git a/mcs/nunit20/TestResult.xml b/mcs/nunit20/TestResult.xml
new file mode 100755 (executable)
index 0000000..1b02d4a
--- /dev/null
@@ -0,0 +1,62 @@
+<?xml version="1.0" standalone="no"?>\r
+<!--This file represents the results of running a test suite-->\r
+<test-results name="C:\cygwin\home\Nick\mcs\nunit20\corlib_reference2.dll" total="42" failures="0" not-run="0" date="12/2/2002" time="10:38 PM">\r
+  <test-suite name="C:\cygwin\home\Nick\mcs\nunit20\corlib_reference2.dll" success="True" time="0.400576">\r
+    <results>\r
+      <test-suite name="MonoTests" success="True" time="0.3805472">\r
+        <results>\r
+          <test-suite name="System" success="True" time="0.3705328">\r
+            <results>\r
+              <test-suite name="ArrayTest" success="True" time="0.350504">\r
+                <results>\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIsFixedSize" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIsReadOnly" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIsSynchronized" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestLength" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestRank" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestBinarySearch1" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestBinarySearch2" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestClear" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestClone" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestCopy" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestCopy2" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestCopyTo" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestCreateInstance" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestGetEnumerator" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestGetEnumeratorMultipleDimension" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestGetEnumeratorNonZeroLowerBounds" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIList_Add" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIList_Insert" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIList_Remove" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIList_RemoveAt" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIList_Contains" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIList_IndexOf" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestGetLength" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestGetLowerBound" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestGetUpperBound" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestGetValue1" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestGetValue2" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestGetValue3" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestGetValueN" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIndexOf1" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIndexOf2" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestIndexOf3" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestLastIndexOf1" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestLastIndexOf2" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestLastIndexOf3" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestReverse" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestSetValue1" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestSetValue2" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestSetValue3" executed="True" success="True" time="0.000" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestSetValueN" executed="True" success="True" time="0.010" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestSetValue4" executed="True" success="True" time="0.050" />\r
+                  <test-case name="MonoTests.System.ArrayTest.TestSort" executed="True" success="True" time="0.010" />\r
+                </results>\r
+              </test-suite>\r
+            </results>\r
+          </test-suite>\r
+        </results>\r
+      </test-suite>\r
+    </results>\r
+  </test-suite>\r
+</test-results>
\ No newline at end of file
diff --git a/mcs/nunit20/license.rtf b/mcs/nunit20/license.rtf
new file mode 100755 (executable)
index 0000000..f715cf4
--- /dev/null
@@ -0,0 +1,37 @@
+{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch13\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f13\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??\'a1\'a7??};}{\f36\fnil\fcharset134\fprq2{\*\panose 00000000000000000000}@SimSun;}
+{\f37\froman\fcharset238\fprq2 Times New Roman CE;}{\f38\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f40\froman\fcharset161\fprq2 Times New Roman Greek;}{\f41\froman\fcharset162\fprq2 Times New Roman Tur;}
+{\f42\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f43\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f44\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f45\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
+{\f57\fmodern\fcharset238\fprq1 Courier New CE;}{\f58\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f60\fmodern\fcharset161\fprq1 Courier New Greek;}{\f61\fmodern\fcharset162\fprq1 Courier New Tur;}{\f62\fmodern\fcharset177\fprq1 Courier New (Hebrew);}
+{\f63\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f64\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f65\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f169\fnil\fcharset0\fprq2 SimSun Western{\*\falt ??\'a1\'a7??};}
+{\f399\fnil\fcharset0\fprq2 @SimSun Western;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;
+\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\fs24\lang1033\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 \snext0 Normal;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
+\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\loch\f0\hich\af0\dbch\af13\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{
+\s15\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1033\langfe2052\loch\f2\hich\af2\dbch\af13\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext15 \styrsid9332467 Plain Text;}}{\*\rsidtbl \rsid610709\rsid818068
+\rsid7476632\rsid9332467\rsid10426157\rsid11172945\rsid15552035}{\*\generator Microsoft Word 10.0.2627;}{\info{\title Copyright (c) 2002 James W}{\author James Newkirk}{\operator James Newkirk}{\creatim\yr2002\mo9\dy11\hr14\min43}
+{\revtim\yr2002\mo9\dy12\hr17\min37}{\version5}{\edmins3}{\nofpages1}{\nofwords153}{\nofchars878}{\*\company Nascent Software, Inc.}{\nofcharsws1029}{\vern16437}}\margl1319\margr1319 
+\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1319\dgvorigin1440\dghshow1\dgvshow1
+\jexpand\viewkind1\viewscale120\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot15552035 \fet0\sectd 
+\linex0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid9332467\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}
+{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang 
+{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain 
+\s15\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9332467 \fs20\lang1033\langfe2052\loch\af2\hich\af2\dbch\af13\cgrid\langnp1033\langfenp2052 {\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Copyright }{
+\insrsid10426157 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2  }{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 2002 James W. Newkirk, Mich}{\insrsid7476632 \hich\af2\dbch\af13\loch\f2 ael C. Two, Alexei A. Vorontsov
+\par \hich\af2\dbch\af13\loch\f2 Copyright \loch\af2\dbch\af13\hich\f2 \'a9\hich\af2\dbch\af13\loch\f2  2000-2002}{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2  Philip A. Craig
+\par 
+\par \hich\af2\dbch\af13\loch\f2 This software is provided 'as-is', without any express or impli\hich\af2\dbch\af13\loch\f2 ed warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+\par 
+\par \hich\af2\dbch\af13\loch\f2 Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it fr\hich\af2\dbch\af13\loch\f2 eely, subject to the following restrictions:
+\par 
+\par \hich\af2\dbch\af13\loch\f2 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product do
+\hich\af2\dbch\af13\loch\f2 cumentation is required.
+\par 
+\par \hich\af2\dbch\af13\loch\f2 Portions Copyright }{\insrsid10426157 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2  2002 James W. Newkirk, }{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Michael C. Two, Alexei A. Vorontsov or Copyright }{
+\insrsid10426157 \loch\af2\dbch\af13\hich\f2 \'a9}{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2  2000-2002 Philip A. Craig
+\par 
+\par \hich\af2\dbch\af13\loch\f2 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the origi\hich\af2\dbch\af13\loch\f2 nal software.
+\par 
+\par \hich\af2\dbch\af13\loch\f2 3. This notice may not be removed or altered from any source distribution.}{\insrsid9332467 
+\par }}
\ No newline at end of file
diff --git a/mcs/nunit20/makefile b/mcs/nunit20/makefile
new file mode 100755 (executable)
index 0000000..771eacd
--- /dev/null
@@ -0,0 +1,17 @@
+NANT   = ../nant/NAnt.exe
+
+all: build
+
+linux: build
+
+windows: build
+
+build: framework/Transform.resources
+       $(NANT) build
+
+framework/Transform.resources: 
+       resgen framework/Transform.resX
+
+clean:
+       $(NANT) clean
+
diff --git a/mcs/nunit20/makefile.gnu b/mcs/nunit20/makefile.gnu
new file mode 100755 (executable)
index 0000000..5de2373
--- /dev/null
@@ -0,0 +1,13 @@
+DIRS=framework util nunit-console
+
+default: all
+
+all:
+       for d in $(DIRS) ; do \
+               $(MAKE) -C $$d -f makefile.gnu || exit 1; \
+       done
+
+clean:
+       for d in $(DIRS) ; do \
+               $(MAKE) -C $$d -f makefile.gnu clean || exit 1; \
+       done
\ No newline at end of file
diff --git a/mcs/nunit20/nunit-console.sln b/mcs/nunit20/nunit-console.sln
new file mode 100755 (executable)
index 0000000..3ec499e
--- /dev/null
@@ -0,0 +1,17 @@
+Microsoft Visual Studio Solution File, Format Version 7.00\r
+Project("{8BC9CEB9-8B4A-11D0-8D11-00A0C91BC942}") = "nunit-console.exe", "nunit-console.exe", "{73335CBD-181C-46CB-A2D2-189EDBE976CF}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfiguration) = preSolution\r
+               ConfigName.0 = Debug\r
+       EndGlobalSection\r
+       GlobalSection(ProjectDependencies) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfiguration) = postSolution\r
+               {73335CBD-181C-46CB-A2D2-189EDBE976CF}.Debug.ActiveCfg = Debug\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityGlobals) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityAddIns) = postSolution\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/mcs/nunit20/nunit-console.suo b/mcs/nunit20/nunit-console.suo
new file mode 100755 (executable)
index 0000000..f80bf10
Binary files /dev/null and b/mcs/nunit20/nunit-console.suo differ
diff --git a/mcs/nunit20/nunit.build b/mcs/nunit20/nunit.build
new file mode 100755 (executable)
index 0000000..4ebe653
--- /dev/null
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<!-- NAnt build file for NUnit2 -->\r
+\r
+<project name="NUnit" default="build">\r
+       <property name="debug" value="true"/>\r
+\r
+       <target name="build">\r
+               <csc target="library" output="NUnit.Framework.dll" debug="${debug}">\r
+                       <sources basedir="framework">\r
+                               <includes name="*.cs"/>\r
+                       </sources>\r
+                       <arg value="/resource:framework/Transform.resources,NUnit.Framework.Transform.resources"/>\r
+                       <arg value="/d:StronglyNamedAssembly=false"/>\r
+               </csc>\r
+\r
+               <csc target="library" output="NUnit.Util.dll" debug="${debug}">\r
+                       <sources basedir="util">\r
+                               <includes name="CommandLineOptions.cs"/>\r
+                               <includes name="ConsoleOptions.cs"/>\r
+                       </sources>\r
+                       <references>\r
+                               <includes name="NUnit.Framework.dll"/>\r
+                       </references>\r
+               </csc>\r
+\r
+               <csc target="exe" output="nunit-console.exe" debug="${debug}">\r
+                       <sources basedir="nunit-console">\r
+                               <includes name="*.cs"/>\r
+                       </sources>\r
+                       <references>\r
+                               <includes name="NUnit.Framework.dll"/>\r
+                               <includes name="NUnit.Util.dll"/>\r
+                       </references>\r
+               </csc>\r
+       </target>\r
+\r
+       <target name="clean">\r
+               <delete file="NUnit.Framework.dll" failonerror="false"/>\r
+               <delete file="NUnit.Framework.pdb" failonerror="false"/>\r
+               <delete file="NUnit.Util.dll" failonerror="false"/>\r
+               <delete file="NUnit.Util.pdb" failonerror="false"/>\r
+               <delete file="nunit-console.exe" failonerror="false"/>\r
+               <delete file="nunit-console.pdb" failonerror="false"/>\r
+               <delete file="framework/Transform.resources" failonerror="false"/>\r
+       </target>\r
+\r
+</project>\r
diff --git a/mcs/nunit20/util/AssemblyInfo.cs b/mcs/nunit20/util/AssemblyInfo.cs
new file mode 100755 (executable)
index 0000000..323cdb4
--- /dev/null
@@ -0,0 +1,61 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]                
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("2.0.9.001")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+#if !StronglyNamedAssembly
+[assembly: AssemblyDelaySign(false)]
+#else
+[assembly: AssemblyKeyFile("..\\..\\..\\Nunit.key")]
+[assembly: AssemblyKeyName("")]
+#endif
diff --git a/mcs/nunit20/util/AssemblyWatcher.cs b/mcs/nunit20/util/AssemblyWatcher.cs
new file mode 100755 (executable)
index 0000000..df341dc
--- /dev/null
@@ -0,0 +1,132 @@
+#region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
+/************************************************************************************
+'
+' Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+' Copyright Â© 2000-2002 Philip A. Craig
+'
+' This software is provided 'as-is', without any express or implied warranty. In no 
+' event will the authors be held liable for any damages arising from the use of this 
+' software.
+' 
+' Permission is granted to anyone to use this software for any purpose, including 
+' commercial applications, and to alter it and redistribute it freely, subject to the 
+' following restrictions:
+'
+' 1. The origin of this software must not be misrepresented; you must not claim that 
+' you wrote the original software. If you use this software in a product, an 
+' acknowledgment (see the following) in the product documentation is required.
+'
+' Portions Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
+' or Copyright Â© 2000-2002 Philip A. Craig
+'
+' 2. Altered source versions must be plainly marked as such, and must not be 
+' misrepresented as being the original software.
+'
+' 3. This notice may not be removed or altered from any source distribution.
+'
+'***********************************************************************************/
+#endregion
+
+
+using System;
+using System.IO;
+using System.Text;
+using System.Timers;
+
+namespace NUnit.Util
+{
+       /// <summary>
+       /// AssemblyWatcher keeps track of a single assembly to see if
+       /// it has changed. It incorporates a delayed notification
+       /// and uses a standard event to notify any interested parties
+       /// about the change. The path to the assembly is provided as
+       /// an argument to the event handler so that one routine can
+       /// be used to handle events from multiple watchers.
+       /// </summary>
+       public class AssemblyWatcher
+       {
+               FileSystemWatcher fileWatcher;
+               protected System.Timers.Timer timer;
+               FileInfo fileInfo;
+
+               public delegate void AssemblyChangedHandler(String fullPath);
+               public event AssemblyChangedHandler AssemblyChangedEvent;
+
+               public AssemblyWatcher(int delay, FileInfo file)
+               {
+                       fileWatcher = new FileSystemWatcher();
+                       fileWatcher.Path = file.DirectoryName;
+                       fileWatcher.Filter = file.Name;
+                       fileWatcher.NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite;
+                       fileWatcher.Changed+=new FileSystemEventHandler(OnChanged);
+                       fileWatcher.EnableRaisingEvents = false;
+
+                       fileInfo = file;
+                       
+                       timer = new System.Timers.Timer( delay );
+                       timer.AutoReset=false;
+                       timer.Enabled=false;
+                       timer.Elapsed+=new ElapsedEventHandler(OnTimer);
+               }
+
+               public string Name
+               {
+                       get { return fileInfo.Name; }
+               }
+
+               public string DirectoryName
+               {
+                       get { return fileInfo.DirectoryName; }
+               }
+
+               public string FullName
+               {
+                       get { return fileInfo.FullName; }
+               }
+
+
+               public void Start()
+               {
+                       fileWatcher.EnableRaisingEvents=true;
+               }
+
+               public void Stop()
+               {
+                       fileWatcher.EnableRaisingEvents=false;
+               }
+
+               protected void OnTimer(Object source, ElapsedEventArgs e)
+               {
+                       lock(this)
+                       {
+                               PublishEvent();
+                               timer.Enabled=false;
+                       }
+               }
+               
+               protected void OnChanged(object source, FileSystemEventArgs e)
+               {
+                       if ( timer != null )
+                       {
+                               lock(this)
+                               {
+                                       if(!timer.Enabled)
+                                       {
+                                               timer.Enabled=true;
+                                       }
+                                       timer.Start();
+                               }
+                       }
+                       else
+                       {
+                               PublishEvent();
+                       }
+               }
+       
+               protected void PublishEvent()
+               {
+                       if ( AssemblyChangedEvent != null )
+                               AssemblyChangedEvent( fileInfo.FullName );
+               }
+       }
+}
\ No newline at end of file
diff --git a/mcs/nunit20/util/CommandLineOptions.cs b/mcs/nunit20/util/CommandLineOptions.cs
new file mode 100755 (executable)
index 0000000..c6e4453
--- /dev/null
@@ -0,0 +1,286 @@
+// File: CommandLineOptions.cs
+//
+// This is a re-usable component to be used when you 
+// need to parse command-line options/parameters.
+//
+// Separates command line parameters from command line options.
+// Uses reflection to populate member variables the derived class with the values 
+// of the options.
+//
+// An option can start with "/", "-" or "--".
+//
+// I define 3 types of "options":
+//   1. Boolean options (yes/no values), e.g: /r to recurse
+//   2. Value options, e.g: /loglevel=3
+//   2. Parameters: standalone strings like file names
+//
+// An example to explain:
+//   csc /nologo /t:exe myfile.cs
+//       |       |      |
+//       |       |      + parameter
+//       |       |
+//       |       + value option
+//       |
+//       + boolean option
+//
+// Please see a short description of the CommandLineOptions class
+// at http://codeblast.com/~gert/dotnet/sells.html
+// 
+// Gert Lombard (gert@codeblast.com)
+// James Newkirk (jim@nunit.org)
+
+namespace Codeblast
+{
+       using System;
+       using System.Reflection;
+       using System.Collections;
+       using System.Text;
+
+       //
+       // The Attributes
+       //
+
+       [AttributeUsage(AttributeTargets.Field)]
+       public class OptionAttribute : Attribute 
+       {
+               protected object optValue;
+               protected string optName;
+               protected string description;
+
+               public string Short 
+               {
+                       get { return optName; }
+                       set { optName = value; }
+               }
+
+               public object Value
+               {
+                       get { return optValue; }
+                       set { optValue = value; }
+               }
+
+               public string Description 
+               {
+                       get { return description; }
+                       set { description = value; }
+               }
+       }
+
+       //
+       // The CommandLineOptions members
+       //
+
+       public abstract class CommandLineOptions
+       {
+               protected ArrayList parameters;
+               private int optionCount;
+
+               public CommandLineOptions(string[] args)
+               {
+                       optionCount = Init(args);
+               }
+
+               public bool NoArgs
+               {
+                       get 
+                       { 
+                               return ParameterCount == 0 && optionCount == 0;
+                       }
+               }
+
+               public int Init(string[] args)
+               {
+                       int count = 0;
+                       int n = 0;
+                       while (n < args.Length)
+                       {
+                               int pos = IsOption(args[n]);
+                               if (pos > 0)
+                               {
+                                       // It's an option:
+                                       if (GetOption(args, ref n, pos))
+                                               count++;
+                                       else
+                                               InvalidOption(args[Math.Min(n, args.Length-1)]);
+                               }
+                               else
+                               {
+                                       // It's a parameter:
+                                       if (parameters == null) parameters = new ArrayList();
+                                       parameters.Add(args[n]);
+                               }
+                               n++;
+                       }
+                       return count;
+               }
+
+               // An option starts with "/", "-" or "--":
+               protected virtual int IsOption(string opt)
+               {
+                       char[] c = null;
+                       if (opt.Length < 2) 
+                       {
+                               return 0;
+                       }
+                       else if (opt.Length > 2)
+                       {
+                               c = opt.ToCharArray(0, 3);
+                               if (c[0] == '-' && c[1] == '-' && IsOptionNameChar(c[2])) return 2;
+                       }
+                       else
+                       {
+                               c = opt.ToCharArray(0, 2);
+                       }
+                       if ((c[0] == '-' || c[0] == '/') && IsOptionNameChar(c[1])) return 1;
+                       return 0; 
+               }
+
+               protected virtual bool IsOptionNameChar(char c)
+               {
+                       return Char.IsLetterOrDigit(c) || c == '?';
+               }
+
+               protected abstract void InvalidOption(string name);
+
+               protected virtual bool MatchShortName(FieldInfo field, string name)
+               {
+                       object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true);
+                       foreach (OptionAttribute att in atts)
+                       {
+                               if (string.Compare(att.Short, name, true) == 0) return true;
+                       }
+                       return false;
+               }
+
+               protected virtual FieldInfo GetMemberField(string name)
+               {
+                       Type t = this.GetType();
+                       FieldInfo[] fields = t.GetFields(BindingFlags.Instance|BindingFlags.Public);
+                       foreach (FieldInfo field in fields)
+                       {
+                               if (string.Compare(field.Name, name, true) == 0) return field;
+                               if (MatchShortName(field, name)) return field;
+                       }
+                       return null;
+               }
+
+               protected virtual object GetOptionValue(FieldInfo field)
+               {
+                       object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true);
+                       if (atts.Length > 0)
+                       {
+                               OptionAttribute att = (OptionAttribute)atts[0];
+                               return att.Value;
+                       }
+                       return null;
+               }
+
+               protected virtual bool GetOption(string[] args, ref int index, int pos)
+               {
+                       try
+                       {
+                               object cmdLineVal = null;
+                               string opt = args[index].Substring(pos, args[index].Length-pos);
+                               SplitOptionAndValue(ref opt, ref cmdLineVal);
+                               FieldInfo field = GetMemberField(opt);
+                               if (field != null)
+                               {
+                                       object value = GetOptionValue(field);
+                                       if (value == null)
+                                       {
+                                               if (field.FieldType == typeof(bool))
+                                                       value = true; // default for bool values is true
+                                               else if(field.FieldType == typeof(string))
+                                               {
+                                                       value = cmdLineVal != null ? cmdLineVal : args[++index];
+                                                       field.SetValue(this, Convert.ChangeType(value, field.FieldType));
+                                                       string stringValue = (string)value;
+                                                       if(stringValue == null || stringValue.Length == 0) return false; 
+                                                       return true;
+                                               }
+                                               else
+                                                       value = cmdLineVal != null ? cmdLineVal : args[++index];
+                                       }
+                                       field.SetValue(this, Convert.ChangeType(value, field.FieldType));
+                                       return true;
+                               }
+                       }
+                       catch (Exception) 
+                       {
+                               // Ignore exceptions like type conversion errors.
+                       }
+                       return false;
+               }
+
+               protected virtual void SplitOptionAndValue(ref string opt, ref object val)
+               {
+                       // Look for ":" or "=" separator in the option:
+                       int pos = opt.IndexOf(':');
+                       if (pos < 1) pos = opt.IndexOf('=');
+                       if (pos < 1) return;
+
+                       val = opt.Substring(pos+1);
+                       opt = opt.Substring(0, pos);
+               }
+
+               // Parameter accessor:
+               public string this[int index]
+               {
+                       get
+                       {
+                               if (parameters != null) return (string)parameters[index];
+                               return null;
+                       }
+               }
+
+               public ArrayList Parameters
+               {
+                       get { return parameters; }
+               }
+
+               public int ParameterCount
+               {
+                       get
+                       {
+                               return parameters == null ? 0 : parameters.Count;
+                       }
+               }
+
+               public virtual void Help()
+               {
+                       Console.WriteLine(GetHelpText());
+               }
+
+               public virtual string GetHelpText()
+               {
+                       StringBuilder helpText = new StringBuilder();
+
+                       Type t = this.GetType();
+                       FieldInfo[] fields = t.GetFields(BindingFlags.Instance|BindingFlags.Public);
+                       foreach (FieldInfo field in fields)
+                       {
+                               object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true);
+                               if (atts.Length > 0)
+                               {
+                                       OptionAttribute att = (OptionAttribute)atts[0];
+                                       if (att.Description != null)
+                                       {
+                                               string valType = "";
+                                               if (att.Value == null)
+                                               {
+                                                       if (field.FieldType == typeof(float)) valType = "=FLOAT";
+                                                       else if (field.FieldType == typeof(string)) valType = "=STR";
+                                                       else if (field.FieldType != typeof(bool)) valType = "=X";
+                                               }
+
+                                               helpText.AppendFormat("/{0,-20}{1}", field.Name+valType, att.Description);
+                                               if (att.Short != null) 
+                                                       helpText.AppendFormat(" (Short format: /{0}{1})", att.Short, valType);
+                                               helpText.Append('\n');
+                                       }
+                               }
+                       }
+                       return helpText.ToString();
+               }
+       }
+}
diff --git a/mcs/nunit20/util/ConsoleOptions.cs b/mcs/nunit20/util/ConsoleOptions.cs
new file mode 100755 (executable)
index 0000000..2abe588
--- /dev/null
@@ -0,0 +1,91 @@
+namespace NUnit.Util
+{
+       using System;
+       using Codeblast;
+
+       public class ConsoleOptions : CommandLineOptions
+       {
+               [Option(Description = "Fixture to test")]
+               public string fixture;
+
+               [Option(Description = "Name of Xml output file")]
+               public string xml;
+
+               [Option(Description = "Name of transform file")]
+               public string transform;
+
+               [Option(Description = "Do not display the logo")]
+               public bool nologo = false;
+
+               [Option(Short="?", Description = "Display help")]
+               public bool help = false;
+
+               [Option(Description = "Require input to close console window")]
+               public bool wait = false;
+
+               private bool isInvalid = false; 
+
+               public ConsoleOptions(String[] args) : base(args) 
+               {}
+
+               protected override void InvalidOption(string name)
+               {
+                       isInvalid = true;
+               }
+
+               public bool Validate()
+               {
+                       if(isInvalid) return false; 
+
+                       if(NoArgs) return true; 
+
+                       if(IsFixture) return true; 
+
+                       if(ParameterCount == 1) return true; 
+
+                       return false;
+               }
+
+               public string Assembly
+               {
+                       get 
+                       {
+                               return (string)Parameters[0];
+                       }
+               }
+
+
+               public bool IsAssembly 
+               {
+                       get 
+                       {
+                               return ParameterCount == 1 && !IsFixture;
+                       }
+               }
+
+               public bool IsFixture 
+               {
+                       get 
+                       {
+                               return ParameterCount == 1 && 
+                                          ((fixture != null) && (fixture.Length > 0));
+                       }
+               }
+
+               public bool IsXml 
+               {
+                       get 
+                       {
+                               return (xml != null) && (xml.Length != 0);
+                       }
+               }
+
+               public bool IsTransform 
+               {
+                       get 
+                       {
+                               return (transform != null) && (transform.Length != 0);
+                       }
+               }
+       }
+}
\ No newline at end of file
diff --git a/mcs/nunit20/util/FileChangedEventHandler.cs b/mcs/nunit20/util/FileChangedEventHandler.cs
new file mode 100755 (executable)
index 0000000..e1d4ab3
--- /dev/null
@@ -0,0 +1,38 @@
+#region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
+/************************************************************************************
+'
+' Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+' Copyright Â© 2000-2002 Philip A. Craig
+'
+' This software is provided 'as-is', without any express or implied warranty. In no 
+' event will the authors be held liable for any damages arising from the use of this 
+' software.
+' 
+' Permission is granted to anyone to use this software for any purpose, including 
+' commercial applications, and to alter it and redistribute it freely, subject to the 
+' following restrictions:
+'
+' 1. The origin of this software must not be misrepresented; you must not claim that 
+' you wrote the original software. If you use this software in a product, an 
+' acknowledgment (see the following) in the product documentation is required.
+'
+' Portions Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
+' or Copyright Â© 2000-2002 Philip A. Craig
+'
+' 2. Altered source versions must be plainly marked as such, and must not be 
+' misrepresented as being the original software.
+'
+' 3. This notice may not be removed or altered from any source distribution.
+'
+'***********************************************************************************/
+#endregion
+
+using System;
+
+namespace NUnit.Util
+{
+       public interface FileChangedEventHandler
+       {
+               void OnChanged(String fullPath);
+       }
+}
diff --git a/mcs/nunit20/util/GuiOptions.cs b/mcs/nunit20/util/GuiOptions.cs
new file mode 100755 (executable)
index 0000000..45f2a2f
--- /dev/null
@@ -0,0 +1,40 @@
+namespace NUnit.Util
+{
+       using System;
+       using Codeblast;
+
+       public class GuiOptions : CommandLineOptions
+       {
+               private bool isInvalid = false; 
+
+               [Option(Short="?", Description = "Display help")]
+               public bool help = false;
+
+               public GuiOptions(String[] args) : base(args) 
+               {}
+
+               protected override void InvalidOption(string name)
+               { isInvalid = true; }
+
+               public string Assembly
+               {
+                       get 
+                       {
+                               return (string)Parameters[0];
+                       }
+               }
+
+               public bool IsAssembly
+               {
+                       get 
+                       {
+                               return ParameterCount == 1;
+                       }
+               }
+
+               public bool Validate()
+               {
+                       return (NoArgs || ParameterCount == 1) && !isInvalid;
+               }
+       }
+}
\ No newline at end of file
diff --git a/mcs/nunit20/util/NUnitRegistry.cs b/mcs/nunit20/util/NUnitRegistry.cs
new file mode 100755 (executable)
index 0000000..1812197
--- /dev/null
@@ -0,0 +1,123 @@
+#region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
+/************************************************************************************
+'
+' Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+' Copyright Â© 2000-2002 Philip A. Craig
+'
+' This software is provided 'as-is', without any express or implied warranty. In no 
+' event will the authors be held liable for any damages arising from the use of this 
+' software.
+' 
+' Permission is granted to anyone to use this software for any purpose, including 
+' commercial applications, and to alter it and redistribute it freely, subject to the 
+' following restrictions:
+'
+' 1. The origin of this software must not be misrepresented; you must not claim that 
+' you wrote the original software. If you use this software in a product, an 
+' acknowledgment (see the following) in the product documentation is required.
+'
+' Portions Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
+' or Copyright Â© 2000-2002 Philip A. Craig
+'
+' 2. Altered source versions must be plainly marked as such, and must not be 
+' misrepresented as being the original software.
+'
+' 3. This notice may not be removed or altered from any source distribution.
+'
+'***********************************************************************************/
+#endregion
+
+namespace NUnit.Util
+{
+       using System;
+       using Microsoft.Win32;
+
+       /// <summary>
+       /// NUnitRegistry provides static properties for NUnit's
+       /// CurrentUser and LocalMachine subkeys.
+       /// </summary>
+       public class NUnitRegistry
+       {
+               private static readonly string KEY = "Software\\Nascent Software\\Nunit\\";
+
+               private static bool testMode = false;
+               private static string testKey = "Software\\Nascent Software\\Nunit-Test";
+
+               /// <summary>
+               /// Prevent construction of object
+               /// </summary>
+               private NUnitRegistry() { }
+
+               public static bool TestMode
+               {
+                       get { return testMode; }
+                       set { testMode = value; }
+               }
+
+               public static string TestKey
+               {
+                       get { return testKey; }
+                       set { testKey = value; }
+               }
+
+               /// <summary>
+               /// Registry subkey for the current user
+               /// </summary>
+               public static RegistryKey CurrentUser
+               {
+                       get 
+                       {
+                               // Todo: Code can go here to migrate the registry
+                               // if we change our location.
+                               //      Try to open new key
+                               //      if ( key doesn't exist )
+                               //              create it
+                               //              open old key
+                               //              if ( it was opened )
+                               //                      copy entries to new key
+                               //      return new key
+                               return Registry.CurrentUser.CreateSubKey( testMode ? testKey : KEY ); 
+                       }
+               }
+
+               /// <summary>
+               /// Registry subkey for the local machine
+               /// </summary>
+               public static RegistryKey LocalMachine
+               {
+                       get { return Registry.LocalMachine.CreateSubKey( testMode ? testKey : KEY ); }
+               }
+
+               public static void ClearTestKeys()
+               {
+                       ClearSubKey( Registry.CurrentUser, testKey );
+                       ClearSubKey( Registry.LocalMachine, testKey );
+               }
+
+               /// <summary>
+               /// Static function that clears out the contents of a subkey
+               /// </summary>
+               /// <param name="baseKey">Base key for the subkey</param>
+               /// <param name="subKey">Name of the subkey</param>
+               public static void ClearSubKey( RegistryKey baseKey, string subKey )
+               {
+                       using( RegistryKey key = baseKey.OpenSubKey( subKey, true ) )
+                       {
+                               if ( key != null ) ClearKey( key );
+                       }
+               }
+
+               /// <summary>
+               /// Static function that clears out the contents of a key
+               /// </summary>
+               /// <param name="key">Key to be cleared</param>
+               public static void ClearKey( RegistryKey key )
+               {
+                       foreach( string name in key.GetValueNames() )
+                               key.DeleteValue( name );
+
+                       foreach( string name in key.GetSubKeyNames() )
+                               key.DeleteSubKeyTree( name );
+               }
+       }
+}
diff --git a/mcs/nunit20/util/RecentAssemblySettings.cs b/mcs/nunit20/util/RecentAssemblySettings.cs
new file mode 100755 (executable)
index 0000000..2341182
--- /dev/null
@@ -0,0 +1,134 @@
+#region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
+/************************************************************************************
+'
+' Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+' Copyright Â© 2000-2002 Philip A. Craig
+'
+' This software is provided 'as-is', without any express or implied warranty. In no 
+' event will the authors be held liable for any damages arising from the use of this 
+' software.
+' 
+' Permission is granted to anyone to use this software for any purpose, including 
+' commercial applications, and to alter it and redistribute it freely, subject to the 
+' following restrictions:
+'
+' 1. The origin of this software must not be misrepresented; you must not claim that 
+' you wrote the original software. If you use this software in a product, an 
+' acknowledgment (see the following) in the product documentation is required.
+'
+' Portions Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
+' or Copyright Â© 2000-2002 Philip A. Craig
+'
+' 2. Altered source versions must be plainly marked as such, and must not be 
+' misrepresented as being the original software.
+'
+' 3. This notice may not be removed or altered from any source distribution.
+'
+'***********************************************************************************/
+#endregion
+
+using System;
+using System.Collections;
+
+namespace NUnit.Util
+{
+       /// <summary>
+       /// RecentAssemblySettings holds settings for recent assemblies
+       /// </summary>
+       public class RecentAssemblySettings : SettingsGroup
+       {
+               private static readonly string NAME = "Recent-Assemblies";
+               
+               private static string[] valueNames = {  "RecentAssembly1", 
+                                                                                               "RecentAssembly2", 
+                                                                                               "RecentAssembly3", 
+                                                                                               "RecentAssembly4", 
+                                                                                               "RecentAssembly5" };
+
+               private IList assemblyEntries;
+
+               public RecentAssemblySettings( ) : base ( NAME, UserSettings.GetStorageImpl( NAME ) )
+               {
+                       LoadAssemblies();
+               }
+
+               public RecentAssemblySettings( SettingsStorage storage ) : base( NAME, storage ) 
+               {
+                       LoadAssemblies();
+               }
+
+               public RecentAssemblySettings( SettingsGroup parent ) : base( NAME, parent ) 
+               { 
+                       LoadAssemblies();
+               }
+
+               private void LoadAssemblies()
+               {
+                       assemblyEntries = new ArrayList();
+                       foreach( string valueName in valueNames )
+                       {
+                               string assemblyName = LoadStringSetting(valueName);
+                               if(assemblyName != null)
+                                       assemblyEntries.Add(assemblyName);
+                       }
+               }
+
+               public override void Clear()
+               {
+                       base.Clear();
+                       assemblyEntries = new ArrayList();
+               }
+
+               public IList GetAssemblies()
+               {
+                       return assemblyEntries;
+               }
+               
+               public string RecentAssembly
+               {
+                       get 
+                       { 
+                               if(assemblyEntries.Count > 0)
+                                       return (string)assemblyEntries[0];
+
+                               return null;
+                       }
+                       set
+                       {
+                               int index = assemblyEntries.IndexOf(value);
+
+                               if(index == 0) return;
+
+                               if(index != -1)
+                               {
+                                       assemblyEntries.RemoveAt(index);
+                               }
+
+                               assemblyEntries.Insert(0, value);
+                               if(assemblyEntries.Count > valueNames.Length)
+                                       assemblyEntries.RemoveAt(valueNames.Length);
+
+                               SaveSettings();                 
+                       }
+               }
+
+               public void Remove(string assemblyName)
+               {
+                       assemblyEntries.Remove(assemblyName);
+                       SaveSettings();
+               }
+
+               private void SaveSettings()
+               {
+                       for ( int index = 0; 
+                                 index < valueNames.Length;
+                                 index++)
+                       {
+                               if ( index < assemblyEntries.Count )
+                                       SaveSetting( valueNames[index], assemblyEntries[index] );
+                               else
+                                       RemoveSetting( valueNames[index] );
+                       }
+               }
+       }
+}
diff --git a/mcs/nunit20/util/RecentAssemblyUtil.cs b/mcs/nunit20/util/RecentAssemblyUtil.cs
new file mode 100755 (executable)
index 0000000..e0e4c9d
--- /dev/null
@@ -0,0 +1,112 @@
+/********************************************************************************************************************
+'
+' Copyright (c) 2002, James Newkirk, Michael C. Two, Alexei Vorontsov, Philip Craig
+'
+' Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
+' documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
+' the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
+' to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+'
+' The above copyright notice and this permission notice shall be included in all copies or substantial portions 
+' of the Software.
+'
+' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+' THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+' CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+' DEALINGS IN THE SOFTWARE.
+'
+'*******************************************************************************************************************/
+namespace NUnit.Util
+{
+       using System;
+       using System.Collections;
+       using Microsoft.Win32;
+
+       /// <summary>
+       /// Summary description for RecentAssembly.
+       /// </summary>
+       public class RecentAssemblyUtil
+       {
+               private RegistryKey key;
+               private static string[] valueNames = { "RecentAssembly1", 
+                                                                                          "RecentAssembly2", 
+                                                                                          "RecentAssembly3", 
+                                                                                          "RecentAssembly4", 
+                                                                                          "RecentAssembly5" };
+               private string subKey;
+
+               private IList assemblyEntries;
+
+               public RecentAssemblyUtil(string subKey)
+               {
+                       this.subKey = subKey;
+                       key = NUnitRegistry.CurrentUser.CreateSubKey(subKey);
+                       assemblyEntries = new ArrayList();
+                       for(int index = 0; index < valueNames.Length; index++)
+                       {
+                               string valueName = (string)key.GetValue(valueNames[index]);
+                               if(valueName != null)
+                                       assemblyEntries.Add(valueName);
+                       }
+               }
+
+               public void Clear()
+               {
+                       NUnitRegistry.CurrentUser.DeleteSubKeyTree(subKey);
+                       assemblyEntries = new ArrayList();
+               }
+
+               public string RecentAssembly
+               {
+                       get 
+                       { 
+                               if(assemblyEntries.Count > 0)
+                                       return (string)assemblyEntries[0];
+
+                               return null;
+                       }
+                       set
+                       {
+                               int index = assemblyEntries.IndexOf(value);
+
+                               if(index == 0) return;
+
+                               if(index != -1)
+                               {
+                                       assemblyEntries.RemoveAt(index);
+                               }
+
+                               assemblyEntries.Insert(0, value);
+                               if(assemblyEntries.Count > valueNames.Length)
+                                       assemblyEntries.RemoveAt(valueNames.Length);
+
+                               SaveToRegistry();                       
+                       }
+               }
+
+               public IList GetAssemblies()
+               {
+                       return assemblyEntries;
+               }
+
+               public void Remove(string assemblyName)
+               {
+                       assemblyEntries.Remove(assemblyName);
+                       SaveToRegistry();
+               }
+
+               private void SaveToRegistry()
+               {
+                       for(int index = 0; 
+                               index < valueNames.Length;
+                               index++)
+                       {
+                               if ( index < assemblyEntries.Count )
+                                       key.SetValue(valueNames[index], assemblyEntries[index]);
+                               else
+                                       key.DeleteValue(valueNames[index], false);
+                       }
+               }
+       }
+}
diff --git a/mcs/nunit20/util/RegistrySettingsStorage.cs b/mcs/nunit20/util/RegistrySettingsStorage.cs
new file mode 100755 (executable)
index 0000000..7eff707
--- /dev/null
@@ -0,0 +1,263 @@
+#region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
+/************************************************************************************
+'
+' Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+' Copyright Â© 2000-2002 Philip A. Craig
+'
+' This software is provided 'as-is', without any express or implied warranty. In no 
+' event will the authors be held liable for any damages arising from the use of this 
+' software.
+' 
+' Permission is granted to anyone to use this software for any purpose, including 
+' commercial applications, and to alter it and redistribute it freely, subject to the 
+' following restrictions:
+'
+' 1. The origin of this software must not be misrepresented; you must not claim that 
+' you wrote the original software. If you use this software in a product, an 
+' acknowledgment (see the following) in the product documentation is required.
+'
+' Portions Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
+' or Copyright Â© 2000-2002 Philip A. Craig
+'
+' 2. Altered source versions must be plainly marked as such, and must not be 
+' misrepresented as being the original software.
+'
+' 3. This notice may not be removed or altered from any source distribution.
+'
+'***********************************************************************************/
+#endregion
+
+using System;
+using System.Diagnostics;
+using Microsoft.Win32;
+
+namespace NUnit.Util
+{
+       /// <summary>
+       /// Implementation of SettingsStorage for NUnit user settings,
+       /// based on storage of settings in the registry.
+       /// </summary>
+       public class RegistrySettingsStorage : SettingsStorage, IDisposable
+       {
+               #region Instance Variables
+
+               /// <summary>
+               /// If not null, the registry key for this storage
+               /// </summary>
+               private RegistryKey storageKey;
+
+               #endregion
+
+               #region Construction and Disposal
+
+               /// <summary>
+               /// Construct a storage as a child of another storage
+               /// </summary>
+               /// <param name="storageName">The name to give the storage</param>
+               /// <param name="parentStorage">The parent in which the storage is to be created</param>
+               public RegistrySettingsStorage( string storageName, RegistrySettingsStorage parentStorage ) 
+                       : base( storageName, parentStorage ) 
+               { 
+                       this.storageKey = parentStorage.StorageKey.CreateSubKey( storageName );
+               }
+
+               /// <summary>
+               /// Construct a storage using a registry key. This constructor is
+               /// intended for use at the top level of the hierarchy.
+               /// </summary>
+               /// <param name="storageName">The name to give the storage</param>
+               /// <param name="parentKey">The registry Key under which the storage will be created</param>
+               public RegistrySettingsStorage( string storageName, RegistryKey parentKey ) 
+                       : base ( storageName, null )
+               {
+                       this.storageKey = parentKey.CreateSubKey( storageName );
+               }
+
+               /// <summary>
+               /// Construct a storage on top of a given key, using the key's name
+               /// </summary>
+               /// <param name="storageKey"></param>
+               public RegistrySettingsStorage( RegistryKey storageKey )
+                       : base( storageKey.Name, null )
+               {
+                       this.storageKey = storageKey;
+               }
+
+               /// <summary>
+               /// Dispose of this object by closing the storage key, if any
+               /// </summary>
+               public override void Dispose()
+               {
+                       if ( storageKey != null )
+                               storageKey.Close();
+               }
+
+               #endregion
+
+               #region Properties
+
+               /// <summary>
+               /// The registry key used to hold this storage
+               /// </summary>
+               public RegistryKey StorageKey
+               {
+                       get { return storageKey; }
+               }
+
+               /// <summary>
+               /// The count of settings in this storage
+               /// </summary>
+               public override int SettingsCount
+               {
+                       get { return storageKey.ValueCount; }
+               }
+
+               #endregion
+
+               #region Methods
+
+               /// <summary>
+               /// Find out if a child storage exists
+               /// </summary>
+               /// <param name="storageName">Name of the child storage</param>
+               /// <returns>True if the child storage exists</returns>
+               public override bool ChildStorageExists( string storageName )
+               {
+                       using (RegistryKey key = storageKey.OpenSubKey( storageName ) )
+                       {
+                               return key != null;
+                       }
+               }
+
+               /// <summary>
+               /// Make a new child storage under this one
+               /// </summary>
+               /// <param name="storageName">Name of the child storage to make</param>
+               /// <returns>New storage</returns>
+               public override SettingsStorage MakeChildStorage( string storageName )
+               {
+                       return new RegistrySettingsStorage( storageName, this );
+               }
+
+               /// <summary>
+               /// Load a setting from this storage
+               /// </summary>
+               /// <param name="settingName">Name of the setting to load</param>
+               /// <returns>Value of the setting</returns>
+               public override object LoadSetting( string settingName )
+               {
+                       return storageKey.GetValue( settingName );
+               }
+
+               /// <summary>
+               /// Load an int setting from this storage. Since int is a
+               /// value type, we can't return null so zero is used to
+               /// indicate that nothing was found - or the found value
+               /// was zero. If you need to distinguish, use your own 
+               /// default value or call LoadSetting and check for null.
+               /// </summary>
+               /// <param name="settingName">Name of the setting to load</param>
+               /// <returns>Value of the setting or zero if missing</returns>
+               public override int LoadIntSetting( string settingName )
+               {
+                       return LoadIntSetting( settingName, 0 );
+               }
+
+               /// <summary>
+               /// Load a string setting from this storage
+               /// </summary>
+               /// <param name="settingName">Name of the setting to load</param>
+               /// <returns>Value of the setting</returns>
+               public override string LoadStringSetting( string settingName )
+               {
+                       object resultValue = storageKey.GetValue( settingName );
+                       if ( resultValue == null || resultValue is string )
+                               return (string) resultValue;
+
+                       return resultValue.ToString();
+               }
+
+               /// <summary>
+               /// Load a setting from this storage or return a default value
+               /// </summary>
+               /// <param name="settingName">Name of setting to load</param>
+               /// <param name="defaultValue">Value to return if the seeting is not present</param>
+               /// <returns>Value of the setting or the default</returns>
+               public override object LoadSetting( string settingName, object defaultValue )
+               {
+                       return storageKey.GetValue( settingName, defaultValue );
+               }
+
+               /// <summary>
+               /// Load an integer setting from this storage or return a default value
+               /// </summary>
+               /// <param name="settingName">Name of setting to load</param>
+               /// <param name="defaultValue">Value to return if the seeting is not present</param>
+               /// <returns>Value of the setting or the default</returns>
+               public override int LoadIntSetting( string settingName, int defaultValue )
+               {
+                       object resultValue = storageKey.GetValue( settingName, defaultValue );
+                       if ( resultValue is int )
+                               return (int)resultValue;
+                       
+                       return int.Parse( (string)resultValue );
+               }
+
+               /// <summary>
+               /// Load a string setting from this storage or return a default value
+               /// </summary>
+               /// <param name="settingName">Name of setting to load</param>
+               /// <param name="defaultValue">Value to return if the seeting is not present</param>
+               /// <returns>Value of the setting or the default</returns>
+               public override string LoadStringSetting( string settingName, string defaultValue )
+               {
+                       object resultValue = storageKey.GetValue( settingName, defaultValue );
+                       if ( resultValue is string )
+                               return (string) resultValue;
+
+                       return resultValue.ToString();
+               }
+
+               /// <summary>
+               /// Remove a setting from the storage
+               /// </summary>
+               /// <param name="settingName">Name of the setting to remove</param>
+               public override void RemoveSetting( string settingName )
+               {
+                       storageKey.DeleteValue( settingName, false );
+               }
+
+               /// <summary>
+               /// Save a setting in this storage
+               /// </summary>
+               /// <param name="settingName">Name of the setting to save</param>
+               /// <param name="settingValue">Value to be saved</param>
+               public override void SaveSetting( string settingName, object settingValue )
+               {
+                       storageKey.SetValue( settingName, settingValue );
+               }
+
+               /// <summary>
+               /// Static function that clears out the contents of a key
+               /// </summary>
+               /// <param name="key">Key to be cleared</param>
+               public static void ClearKey( RegistryKey key )
+               {
+                       foreach( string name in key.GetValueNames() )
+                               key.DeleteValue( name );
+
+                       foreach( string name in key.GetSubKeyNames() )
+                               key.DeleteSubKeyTree( name );
+               }
+
+               /// <summary>
+               /// Clear all settings from the storage - empty storage remains
+               /// </summary>
+               public override void Clear()
+               {
+                       ClearKey( storageKey );
+               }
+
+               #endregion
+       }
+}
diff --git a/mcs/nunit20/util/SettingsGroup.cs b/mcs/nunit20/util/SettingsGroup.cs
new file mode 100755 (executable)
index 0000000..937e8dc
--- /dev/null
@@ -0,0 +1,247 @@
+#region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
+/************************************************************************************
+'
+' Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+' Copyright Â© 2000-2002 Philip A. Craig
+'
+' This software is provided 'as-is', without any express or implied warranty. In no 
+' event will the authors be held liable for any damages arising from the use of this 
+' software.
+' 
+' Permission is granted to anyone to use this software for any purpose, including 
+' commercial applications, and to alter it and redistribute it freely, subject to the 
+' following restrictions:
+'
+' 1. The origin of this software must not be misrepresented; you must not claim that 
+' you wrote the original software. If you use this software in a product, an 
+' acknowledgment (see the following) in the product documentation is required.
+'
+' Portions Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
+' or Copyright Â© 2000-2002 Philip A. Craig
+'
+' 2. Altered source versions must be plainly marked as such, and must not be 
+' misrepresented as being the original software.
+'
+' 3. This notice may not be removed or altered from any source distribution.
+'
+'***********************************************************************************/
+#endregion
+
+namespace NUnit.Util
+{
+       using System;
+       using System.Collections;
+
+       /// <summary>
+       /// SettingsGroup is the base class representing a group
+       /// of user or system settings. A pimpl idiom is used
+       /// to provide implementation-independence.
+       /// </summary>
+       public class SettingsGroup : IDisposable
+       {
+               #region Instance Variables
+               /// <summary>
+               /// The name of this group of settings
+               /// </summary>
+               private string name;
+
+               /// <summary>
+               /// If not null, the storage implementation holding the group settings.
+               /// </summary>
+               private SettingsStorage storageImpl;
+               
+               /// <summary>
+               /// If not null, the settings group that contains this one.
+               /// </summary>
+               private SettingsGroup parentSettings;
+
+               #endregion
+
+               #region Construction and Disposal
+
+               /// <summary>
+               /// Construct a settings group based on a storage implementation.
+               /// </summary>
+               /// <param name="name">Name of the group</param>
+               /// <param name="storageImpl">Storage for the group settings</param>
+               public SettingsGroup( string name, SettingsStorage storageImpl )
+               {
+                       this.name = name;
+                       this.storageImpl = storageImpl;
+               }
+
+               /// <summary>
+               /// Construct a settings group based on a parent group that contains it.
+               /// </summary>
+               /// <param name="name">Name of the group</param>
+               /// <param name="parentSettings">Containing  group</param>
+               public SettingsGroup( string name, SettingsGroup parentSettings )
+               {
+                       this.name = name;
+                       this.parentSettings = parentSettings;
+                       this.storageImpl = parentSettings.Storage.MakeChildStorage( name );
+               }
+
+               /// <summary>
+               /// Dispose of this group by disposing of it's storage implementation
+               /// </summary>
+               public void Dispose()
+               {
+                       if ( storageImpl != null )
+                       {
+                               storageImpl.Dispose();
+                               storageImpl = null;
+                       }
+               }
+
+               #endregion
+
+               #region Properties
+
+               /// <summary>
+               /// The name of the group
+               /// </summary>
+               public string Name
+               {
+                       get { return name; }
+               }
+
+               /// <summary>
+               /// The storage used for the group settings
+               /// </summary>
+               public SettingsStorage Storage
+               {
+                       get { return storageImpl; }
+               }
+
+               /// <summary>
+               /// The number of settings in this group
+               /// </summary>
+               public int SettingsCount
+               {
+                       get { return storageImpl.SettingsCount; }
+               }
+
+               #endregion
+
+               #region Methods
+
+               /// <summary>
+               /// Clear all settings and subgroups in this group
+               /// </summary>
+               public virtual void Clear()
+               {
+                       storageImpl.Clear();
+               }
+
+               /// <summary>
+               /// Load the value of one of the group's settings
+               /// </summary>
+               /// <param name="settingName">Name of setting to load</param>
+               /// <returns>Value of the setting or null</returns>
+               public object LoadSetting( string settingName )
+               {
+                       return storageImpl.LoadSetting( settingName );
+               }
+
+               /// <summary>
+               /// Load the value of one of the group's integer settings
+               /// in a type-safe manner.
+               /// </summary>
+               /// <param name="settingName">Name of setting to load</param>
+               /// <returns>Value of the setting or null</returns>
+               public int LoadIntSetting( string settingName )
+               {
+                       return storageImpl.LoadIntSetting( settingName );
+               }
+
+               /// <summary>
+               /// Load the value of one of the group's string settings
+               /// in a type-safe manner.
+               /// </summary>
+               /// <param name="settingName">Name of setting to load</param>
+               /// <returns>Value of the setting or null</returns>
+               public string LoadStringSetting( string settingName )
+               {
+                       return storageImpl.LoadStringSetting( settingName );
+               }
+
+               /// <summary>
+               /// Load the value of one of the group's settings or return a default value
+               /// </summary>
+               /// <param name="settingName">Name of setting to load</param>
+               /// <param name="defaultValue">Value to return if the seeting is not present</param>
+               /// <returns>Value of the setting or the default</returns>
+               public object LoadSetting( string settingName, object defaultValue )
+               {
+                       return storageImpl.LoadSetting( settingName, defaultValue );
+               }
+
+               /// <summary>
+               /// Load the value of one of the group's integer settings
+               /// in a type-safe manner or return a default value
+               /// </summary>
+               /// <param name="settingName">Name of setting to load</param>
+               /// <param name="defaultValue">Value to return if the seeting is not present</param>
+               /// <returns>Value of the setting or the default</returns>
+               public int LoadIntSetting( string settingName, int defaultValue )
+               {
+                       return storageImpl.LoadIntSetting( settingName, defaultValue );
+               }
+
+               /// <summary>
+               /// Load the value of one of the group's string settings
+               /// in a type-safe manner or return a default value
+               /// </summary>
+               /// <param name="settingName">Name of setting to load</param>
+               /// <param name="defaultValue">Value to return if the seeting is not present</param>
+               /// <returns>Value of the setting or the default</returns>
+               public string LoadStringSetting( string settingName, string defaultValue )
+               {
+                       return storageImpl.LoadStringSetting( settingName, defaultValue );
+               }
+
+               /// <summary>
+               /// Remove a setting from the group
+               /// </summary>
+               /// <param name="settingName">Name of the setting to remove</param>
+               public void RemoveSetting( string settingName )
+               {
+                       storageImpl.RemoveSetting( settingName );
+               }
+
+               /// <summary>
+               /// Save the value of one of the group's settings
+               /// </summary>
+               /// <param name="settingName">Name of the setting to save</param>
+               /// <param name="settingValue">Value to be saved</param>
+               public void SaveSetting( string settingName, object settingValue )
+               {
+                       storageImpl.SaveSetting( settingName, settingValue );
+               }
+
+               /// <summary>
+               /// Save the value of one of the group's integer settings
+               /// in a type-safe manner.
+               /// </summary>
+               /// <param name="settingName">Name of the setting to save</param>
+               /// <param name="settingValue">Value to be saved</param>
+               public void SaveIntSetting( string settingName, int settingValue )
+               {
+                       storageImpl.SaveSetting( settingName, settingValue );
+               }
+
+               /// <summary>
+               /// Save the value of one of the group's string settings
+               /// in a type-safe manner.
+               /// </summary>
+               /// <param name="settingName">Name of the setting to save</param>
+               /// <param name="settingValue">Value to be saved</param>
+               public void SaveStringSetting( string settingName, string settingValue )
+               {
+                       storageImpl.SaveSetting( settingName, settingValue );
+               }
+
+               #endregion
+       }
+}
diff --git a/mcs/nunit20/util/SettingsStorage.cs b/mcs/nunit20/util/SettingsStorage.cs
new file mode 100755 (executable)
index 0000000..30939c3
--- /dev/null
@@ -0,0 +1,185 @@
+#region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
+/************************************************************************************
+'
+' Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+' Copyright Â© 2000-2002 Philip A. Craig
+'
+' This software is provided 'as-is', without any express or implied warranty. In no 
+' event will the authors be held liable for any damages arising from the use of this 
+' software.
+' 
+' Permission is granted to anyone to use this software for any purpose, including 
+' commercial applications, and to alter it and redistribute it freely, subject to the 
+' following restrictions:
+'
+' 1. The origin of this software must not be misrepresented; you must not claim that 
+' you wrote the original software. If you use this software in a product, an 
+' acknowledgment (see the following) in the product documentation is required.
+'
+' Portions Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
+' or Copyright Â© 2000-2002 Philip A. Craig
+'
+' 2. Altered source versions must be plainly marked as such, and must not be 
+' misrepresented as being the original software.
+'
+' 3. This notice may not be removed or altered from any source distribution.
+'
+'***********************************************************************************/
+#endregion
+
+namespace NUnit.Util
+{
+       using System;
+       using System.IO;
+
+       /// <summary>
+       /// Abstract class representing a hierarchical storage used to hold
+       /// application settings. The actual implementation is left to 
+       /// derived classes, and may be based on the registry, isolated
+       /// storage or any other mechanism.
+       /// </summary>
+       public abstract class SettingsStorage : IDisposable
+       {
+               #region Instance Variables
+
+               /// <summary>
+               /// The name of this storage
+               /// </summary>
+               private string storageName;
+               
+               /// <summary>
+               /// The parent storage containing this storage
+               /// </summary>
+               private SettingsStorage parentStorage;
+               #endregion
+
+               #region Construction and Disposal
+
+               /// <summary>
+               /// Construct a SettingsStorage under a parent storage
+               /// </summary>
+               /// <param name="storageName">Name of the storage</param>
+               /// <param name="parentStorage">The parent which contains the new storage</param>
+               public SettingsStorage( string storageName, SettingsStorage parentStorage )
+               {
+                       this.storageName = storageName;
+                       this.parentStorage = parentStorage;
+               }
+
+               /// <summary>
+               /// Dispose of resources held by this storage
+               /// </summary>
+               public abstract void Dispose();
+
+               #endregion
+
+               #region Properties
+
+               /// <summary>
+               /// The number of settings in this group
+               /// </summary>
+               public abstract int SettingsCount
+               {
+                       get;
+               }
+
+               /// <summary>
+               /// The name of the storage
+               /// </summary>
+               public string StorageName
+               {
+                       get { return storageName; }
+               }
+
+               /// <summary>
+               /// The storage that contains this one
+               /// </summary>
+               public SettingsStorage ParentStorage
+               {
+                       get { return parentStorage; }
+               }
+
+               #endregion
+
+               #region Methods
+
+               /// <summary>
+               /// Find out if a substorage exists
+               /// </summary>
+               /// <param name="name">Name of the child storage</param>
+               /// <returns>True if the storage exists</returns>
+               public abstract bool ChildStorageExists( string name );
+
+               /// <summary>
+               /// Create a child storage of the same type
+               /// </summary>
+               /// <param name="name">Name of the child storage</param>
+               /// <returns>New child storage</returns>
+               public abstract SettingsStorage MakeChildStorage( string name );
+
+               /// <summary>
+               /// Clear all settings from the storage - empty storage remains
+               /// </summary>
+               public abstract void Clear();
+
+               /// <summary>
+               /// Load a setting from the storage.
+               /// </summary>
+               /// <param name="settingName">Name of the setting to load</param>
+               /// <returns>Value of the setting or null</returns>
+               public abstract object LoadSetting( string settingName );
+
+               /// <summary>
+               /// Load an integer setting from the storage
+               /// </summary>
+               /// <param name="settingName">Name of the setting to load</param>
+               /// <returns>Value of the setting or null</returns>
+               public abstract int LoadIntSetting( string settingName );
+
+               /// <summary>
+               /// Load a string setting from the storage
+               /// </summary>
+               /// <param name="settingName">Name of the setting to load</param>
+               /// <returns>Value of the setting or null</returns>
+               public abstract string LoadStringSetting( string settingName );
+
+               /// <summary>
+               /// Load a setting from the storage or return a default value
+               /// </summary>
+               /// <param name="settingName">Name of the setting to load</param>
+               /// <param name="settingName">Value to return if the setting is missing</param>
+               /// <returns>Value of the setting or the default value</returns>
+               public abstract object LoadSetting( string settingName, object defaultValue );
+
+               /// <summary>
+               /// Load an integer setting from the storage or return a default value
+               /// </summary>
+               /// <param name="settingName">Name of the setting to load</param>
+               /// <param name="settingName">Value to return if the setting is missing</param>
+               /// <returns>Value of the setting or the default value</returns>
+               public abstract int LoadIntSetting( string settingName, int defaultValue );
+
+               /// <summary>
+               /// Load a string setting from the storage or return a default value
+               /// </summary>
+               /// <param name="settingName">Name of the setting to load</param>
+               /// <param name="settingName">Value to return if the setting is missing</param>
+               /// <returns>Value of the setting or the default value</returns>
+               public abstract string LoadStringSetting( string settingName, string defaultValue );
+
+               /// <summary>
+               /// Remove a setting from the storage
+               /// </summary>
+               /// <param name="settingName">Name of the setting to remove</param>
+               public abstract void RemoveSetting( string settingName );
+
+               /// <summary>
+               /// Save a setting in the storage
+               /// </summary>
+               /// <param name="settingName">Name of the setting to save</param>
+               /// <param name="settingValue">Value to be saved</param>
+               public abstract void SaveSetting( string settingName, object settingValue );
+
+               #endregion
+       }
+}
diff --git a/mcs/nunit20/util/TestEventArgs.cs b/mcs/nunit20/util/TestEventArgs.cs
new file mode 100755 (executable)
index 0000000..6a8ae3d
--- /dev/null
@@ -0,0 +1,122 @@
+using System;
+using System.Diagnostics;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+       /// <summary>
+       /// The delegate for all events related to running tests
+       /// </summary>
+       public delegate void TestEventHandler ( object sender, TestEventArgs args );
+
+       /// <summary>
+       /// Enumeration used to distiguish test events
+       /// </summary>
+       public enum TestAction
+       {
+               RunStarting,
+               RunFinished,
+               SuiteStarting,
+               SuiteFinished,
+               TestStarting,
+               TestFinished
+       }
+       
+       /// <summary>
+       /// Argument used for all test events
+       /// </summary>
+       public class TestEventArgs : EventArgs
+       {
+               private TestAction action;
+               private UITestNode test;
+               private TestResult result;
+               private Exception exception;
+
+               /// <summary>
+               /// Helper to distinguish XxxxStarting from XxxxFinished actions
+               /// </summary>
+               /// <param name="action"></param>
+               /// <returns></returns>
+               private static bool IsStartAction( TestAction action )
+               {
+                       return action == TestAction.RunStarting ||
+                               action == TestAction.SuiteStarting ||
+                               action == TestAction.TestStarting;
+               }
+
+               /// <summary>
+               /// Construct using action and test node
+               /// Used only for XxxxStarting events
+               /// </summary>
+               public TestEventArgs( TestAction action, UITestNode test )
+               {
+                       this.action = action;
+                       this.test = test;
+                       this.result = null;
+                       this.exception = null;
+
+                       Debug.Assert( IsStartAction( action ), "Invalid TestAction in Constructor" );
+               }
+
+               /// <summary>
+               /// Construct using action and test result
+               /// Used only for XxxxFinished events
+               /// </summary>
+               public TestEventArgs( TestAction action, TestResult result )
+               {
+                       this.action = action;
+                       this.test = null;
+                       this.result = result;
+                       this.exception = null;
+
+                       Debug.Assert( !IsStartAction( action ), "Invalid TestAction in Constructor" );
+               }
+
+               /// <summary>
+               /// Construct using action and exception
+               /// Used only for RunFinished event
+               /// </summary>
+               public TestEventArgs( TestAction action, Exception exception )
+               {
+                       this.action = action;
+                       this.test = null;
+                       this.result = null;
+                       this.exception = exception;
+
+                       Debug.Assert( action == TestAction.RunFinished, "Invalid TestAction in Constructor" );
+               }
+
+               /// <summary>
+               /// The action that triggered the event
+               /// </summary>
+               public TestAction Action
+               {
+                       get { return action; }
+               }
+
+               /// <summary>
+               /// Test associated with a starting event
+               /// </summary>
+               public UITestNode Test
+               {
+                       get { return test; }
+               }
+
+               /// <summary>
+               /// Result associated with a finished event
+               /// </summary>
+               public TestResult Result
+               {
+                       get { return result; }
+               }
+
+               /// <summary>
+               /// Exception associated with a RunFinished event
+               /// when caused by a system error or user cancelation
+               /// </summary>
+               public Exception Exception
+               {
+                       get { return exception; }
+               }
+       }
+}
diff --git a/mcs/nunit20/util/TestLoadEventArgs.cs b/mcs/nunit20/util/TestLoadEventArgs.cs
new file mode 100755 (executable)
index 0000000..2e4cf59
--- /dev/null
@@ -0,0 +1,102 @@
+using System;
+using System.Diagnostics;
+
+namespace NUnit.Util
+{
+       /// <summary>
+       /// The delegate used for all events related to loading, unloading and reloading tests
+       /// </summary>
+       public delegate void TestLoadEventHandler( object sender, TestLoadEventArgs e );
+
+       /// <summary>
+       /// Enumeration used to distinguish test load events
+       /// </summary>
+       public enum TestLoadAction
+       {
+               LoadStarting,
+               LoadComplete,
+               LoadFailed,
+               ReloadStarting,
+               ReloadComplete,
+               ReloadFailed,
+               UnloadStarting,
+               UnloadComplete,
+               UnloadFailed
+       }
+
+       /// <summary>
+       /// Argument used for all test load events
+       /// </summary>
+       public class TestLoadEventArgs : EventArgs
+       {
+               private TestLoadAction action;
+               private string assemblyName;
+               private UITestNode test;
+               private Exception exception;
+
+               /// <summary>
+               /// Helper that recognizes failure events
+               /// </summary>
+               private bool IsFailure( TestLoadAction action )
+               {
+                       return action == TestLoadAction.LoadFailed ||
+                               action == TestLoadAction.UnloadFailed ||
+                               action == TestLoadAction.ReloadFailed;
+               }
+
+               /// <summary>
+               /// Constructor for non-failure events
+               /// </summary>
+               public TestLoadEventArgs( TestLoadAction action, 
+                       string assemblyName, UITestNode test )
+               {
+                       this.action = action;
+                       this.assemblyName = assemblyName;
+                       this.test = test;
+
+                       Debug.Assert( !IsFailure( action ), "Invalid TestLoadAction in Constructor" );
+               }
+
+               public TestLoadEventArgs( TestLoadAction action, string assemblyName )
+               {
+                       this.action = action;
+                       this.assemblyName = assemblyName;
+
+                       Debug.Assert( action != TestLoadAction.UnloadStarting || action != TestLoadAction.UnloadComplete, 
+                                       "Invalid TestLoadAction in Constructor" );
+               }
+
+               /// <summary>
+               /// Constructor for failure events
+               /// </summary>
+               public TestLoadEventArgs( TestLoadAction action,
+                       string assemblyName, Exception exception )
+               {
+                       this.action = action;
+                       this.assemblyName = assemblyName;
+                       this.exception = exception;
+
+                       Debug.Assert( IsFailure( action ), "Invalid TestLoadAction in Constructor" );
+               }
+
+               public TestLoadAction Action
+               {
+                       get { return action; }
+               }
+
+               public string AssemblyName
+               {
+                       get { return assemblyName; }
+               }
+
+               public UITestNode Test
+               {
+                       get { return test; }
+               }
+
+               public Exception Exception
+               {
+                       get { return exception; }
+               }
+       }
+}
diff --git a/mcs/nunit20/util/UIHelper.cs b/mcs/nunit20/util/UIHelper.cs
new file mode 100755 (executable)
index 0000000..ba1c174
--- /dev/null
@@ -0,0 +1,98 @@
+#region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
+/************************************************************************************
+'
+' Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+' Copyright Â© 2000-2002 Philip A. Craig
+'
+' This software is provided 'as-is', without any express or implied warranty. In no 
+' event will the authors be held liable for any damages arising from the use of this 
+' software.
+' 
+' Permission is granted to anyone to use this software for any purpose, including 
+' commercial applications, and to alter it and redistribute it freely, subject to the 
+' following restrictions:
+'
+' 1. The origin of this software must not be misrepresented; you must not claim that 
+' you wrote the original software. If you use this software in a product, an 
+' acknowledgment (see the following) in the product documentation is required.
+'
+' Portions Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
+' or Copyright Â© 2000-2002 Philip A. Craig
+'
+' 2. Altered source versions must be plainly marked as such, and must not be 
+' misrepresented as being the original software.
+'
+' 3. This notice may not be removed or altered from any source distribution.
+'
+'***********************************************************************************/
+#endregion
+
+namespace NUnit.Util
+{
+       using System;
+       using NUnit.Core;
+
+       /// <summary>
+       /// Summary description for UIHelper.
+       /// </summary>
+       public class UIHelper
+       {
+               private static bool AreNodesTheSame(Test testOne, Test testTwo)
+               {
+                       if(testOne==null && testTwo!=null) return false;
+                       if(testTwo==null && testOne!=null) return false;
+                       if(testOne.GetType().FullName != testTwo.GetType().FullName) return false;
+                       if(testOne.ShouldRun ^ testTwo.ShouldRun) return false;
+                       return testOne.FullName.Equals(testTwo.FullName);
+               }
+
+               public static bool CompareTree(Test rootTestOriginal, Test rootTestNew)
+               {
+                       if(!AreNodesTheSame(rootTestOriginal,rootTestNew)) return false;
+                       if((rootTestOriginal is TestSuite) && (rootTestNew is TestSuite))
+                       {
+                               TestSuite originalSuite = (TestSuite)rootTestOriginal;
+                               TestSuite newSuite = (TestSuite)rootTestNew;
+                               int originalCount = originalSuite.Tests.Count;
+                               int newCount = newSuite.Tests.Count;
+                               if(originalCount!=newCount)
+                               {
+                                       return false;
+                               }
+                               for(int i=0; i<originalSuite.Tests.Count;i++)
+                               {
+                                       if(!CompareTree((Test)originalSuite.Tests[i],(Test)newSuite.Tests[i])) return false;
+                               }
+                       }
+                       return true;
+               }
+
+               private static bool AreNodesTheSame( UITestNode testOne, UITestNode testTwo )
+               {
+                       if( testOne == null && testTwo != null ) return false;
+                       if( testTwo == null && testOne != null ) return false;
+                       if( testOne.IsSuite != testTwo.IsSuite ) return false;
+                       if( testOne.ShouldRun != testTwo.ShouldRun ) return false;
+
+                       return testOne.FullName.Equals(testTwo.FullName);
+               }
+
+               public static bool CompareTree( UITestNode rootTestOriginal, UITestNode rootTestNew )
+               {
+                       if( !AreNodesTheSame( rootTestOriginal, rootTestNew ) ) 
+                               return false;
+
+                       if( rootTestOriginal.IsSuite && rootTestNew.IsSuite )
+                       {
+                               if( rootTestOriginal.Tests.Count != rootTestNew.Tests.Count )
+                                       return false;
+
+                               for(int i=0; i< rootTestOriginal.Tests.Count; i++)
+                                       if( !CompareTree( (UITestNode)rootTestOriginal.Tests[i], (UITestNode)rootTestNew.Tests[i] ) ) 
+                                               return false;
+                       }
+
+                       return true;
+               }
+       }
+}
diff --git a/mcs/nunit20/util/UITestNode.cs b/mcs/nunit20/util/UITestNode.cs
new file mode 100755 (executable)
index 0000000..ff2229a
--- /dev/null
@@ -0,0 +1,294 @@
+#region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
+/************************************************************************************
+'
+' Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+' Copyright Â© 2000-2002 Philip A. Craig
+'
+' This software is provided 'as-is', without any express or implied warranty. In no 
+' event will the authors be held liable for any damages arising from the use of this 
+' software.
+' 
+' Permission is granted to anyone to use this software for any purpose, including 
+' commercial applications, and to alter it and redistribute it freely, subject to the 
+' following restrictions:
+'
+' 1. The origin of this software must not be misrepresented; you must not claim that 
+' you wrote the original software. If you use this software in a product, an 
+' acknowledgment (see the following) in the product documentation is required.
+'
+' Portions Copyright Â© 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
+' or Copyright Â© 2000-2002 Philip A. Craig
+'
+' 2. Altered source versions must be plainly marked as such, and must not be 
+' misrepresented as being the original software.
+'
+' 3. This notice may not be removed or altered from any source distribution.
+'
+'***********************************************************************************/
+#endregion
+
+namespace NUnit.Util
+{
+       using System;
+       using System.Collections;
+       using NUnit.Core;
+
+       /// <summary>
+       /// UITestNode holds common info needed about a test
+       /// in the UI, avoiding the remoting issues associated
+       /// with holding an actual Test object.
+       /// </summary>
+       public class UITestNode : TestInfo
+       {
+               #region Instance Variables
+
+               /// <summary>
+               /// The full name of the test, including the assembly and namespaces
+               /// </summary>
+               private string fullName;
+
+               /// <summary>
+               /// The test name
+               /// </summary>
+               private string testName;
+
+               /// <summary>
+               /// True if the test should be run
+               /// </summary>
+               private bool shouldRun;
+
+               /// <summary>
+               /// Reason for not running the test
+               /// </summary>
+               private string ignoreReason;
+
+               /// <summary>
+               /// Number of test cases in this test or suite
+               /// </summary>
+               private int testCaseCount;
+
+               /// <summary>
+               /// For a test suite, the child tests or suites
+               /// Null if this is not a test suite
+               /// </summary>
+               private ArrayList tests;
+
+               /// <summary>
+               /// True if this is a suite
+               /// </summary>
+               private bool isSuite;
+
+               /// <summary>
+               /// Interface of the test suite from which this 
+               /// object was constructed. Used for deferred 
+               /// population of the object.
+               /// </summary>
+               private TestInfo testSuite;
+
+               #endregion
+
+               #region Construction and Conversion
+
+               /// <summary>
+               /// Construct from a TestInfo interface, which might be
+               /// a Test or another UITestNode. Optionally, populate
+               /// the array of child tests.
+               /// </summary>
+               /// <param name="test">TestInfo interface from which a UITestNode is to be constructed</param>
+               /// <param name="populate">True if child array is to be populated</param>
+               public UITestNode ( TestInfo test, bool populate )
+               {
+                       fullName = test.FullName;
+                       testName = test.Name;
+                       shouldRun = test.ShouldRun;
+                       ignoreReason = test.IgnoreReason;
+                       
+                       if ( test.IsSuite )
+                       {
+                               testCaseCount = 0;
+                               testSuite = test;
+                               isSuite = true;
+
+                               tests = new ArrayList();
+
+                               if ( populate ) PopulateTests();
+                       }
+                       else
+                       {
+                               testCaseCount = 1;
+                               isSuite = false;
+                       }
+               }
+
+               /// <summary>
+               /// Default construction uses lazy population approach
+               /// </summary>
+               /// <param name="test"></param>
+               public UITestNode ( TestInfo test ) : this( test, false ) { }
+
+               /// <summary>
+               /// Populate the arraylist of child Tests recursively.
+               /// If already populated, it has no effect.
+               /// </summary>
+               public void PopulateTests()
+               {
+                       if ( !Populated )
+                       {
+                               foreach( Test test in testSuite.Tests )
+                               {
+                                       UITestNode node = new UITestNode( test, true );
+                                       tests.Add( node );
+                                       testCaseCount += node.CountTestCases;
+                               }
+
+                               testSuite = null;
+                       }
+               }
+
+               /// <summary>
+               /// Allow implicit conversion of a Test to a TestInfo
+               /// </summary>
+               /// <param name="test"></param>
+               /// <returns></returns>
+               public static implicit operator UITestNode( Test test )
+               {
+                       return new UITestNode( test );
+               }
+
+               #endregion
+
+               #region Properties
+
+               /// <summary>
+               /// The reason for ignoring a test
+               /// </summary>
+               public string IgnoreReason
+               {
+                       get { return ignoreReason; }
+                       set { ignoreReason = value; }
+               }
+
+               /// <summary>
+               /// True if the test should be run
+               /// </summary>
+               public bool ShouldRun
+               {
+                       get { return shouldRun; }
+                       set { shouldRun = value; }
+               }
+
+               /// <summary>
+               /// Full name of the test
+               /// </summary>
+               public string FullName 
+               {
+                       get { return fullName; }
+               }
+
+               /// <summary>
+               /// Name of the test
+               /// </summary>
+               public string Name
+               {
+                       get { return testName; }
+               }
+
+               /// <summary>
+               /// If the name is a path, this just returns the file part
+               /// </summary>
+               public string ShortName
+               {
+                       get
+                       {
+                               string name = Name;
+                               int val = name.LastIndexOf("\\");
+                               if(val != -1)
+                                       name = name.Substring(val+1);
+                               return name;
+                       }
+               }
+
+               /// <summary>
+               /// Count of test cases in this test. If the suite
+               /// has never been populated, it will be done now.
+               /// </summary>
+               public int CountTestCases
+               { 
+                       get 
+                       { 
+                               if ( !Populated )
+                                       PopulateTests();
+
+                               return testCaseCount; 
+                       }
+               }
+
+               /// <summary>
+               /// Array of child tests, null if this is a test case.
+               /// The array is populated on access if necessary.
+               /// </summary>
+               public ArrayList Tests 
+               {
+                       get 
+                       {
+                               if ( !Populated )
+                                       PopulateTests();
+
+                               return tests;
+                       }
+               }
+
+               /// <summary>
+               /// True if this is a suite, false if a test case
+               /// </summary>
+               public bool IsSuite
+               {
+                       get { return isSuite; }
+               }
+
+               /// <summary>
+               /// True if this is a test case, false if a suite
+               /// </summary>
+               public bool IsTestCase
+               {
+                       get { return !isSuite; }
+               }
+
+               /// <summary>
+               /// True if this is a fixture. May populate the test's
+               /// children as a side effect.
+               /// TODO: An easier way to tell this?
+               /// </summary>
+               public bool IsFixture
+               {
+                       get
+                       {
+                               // A test case is obviously not a fixture
+                               if ( IsTestCase ) return false;
+
+                               // We have no way of constructing an empty suite unless it's a fixture
+                               if ( Tests.Count == 0 ) return true;
+                               
+                               // Any suite with children is a fixture if the children are test cases
+                               UITestNode firstChild = (UITestNode)Tests[0];
+                               return !firstChild.IsSuite;
+                       }
+               }
+
+               /// <summary>
+               /// False for suites that have not yet been populated
+               /// with their children, otherwise true - used for testing.
+               /// </summary>
+               public bool Populated
+               {
+                       get { return testSuite == null; }
+               }
+
+               public TestResult Run( EventListener listener )
+               {
+                       throw new InvalidOperationException( "Cannot use Run on a local copy of Test data" );
+               }
+
+               #endregion
+       }
+}
diff --git a/mcs/nunit20/util/makefile.gnu b/mcs/nunit20/util/makefile.gnu
new file mode 100755 (executable)
index 0000000..346fdbf
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Makefile for NUnit.Util.dll
+#
+# Author:
+#   Jackson Harper (Jackson@LatitudeGeo.com)
+#
+
+all:
+       mcs /target:library /r:../NUnit.Framework.dll /out:../NUnit.Util.dll CommandLineOptions.cs ConsoleOptions.cs
+
+clean:
+       rm -f ../NUnit.Util.dll
\ No newline at end of file
diff --git a/mcs/nunit20/util/nunit.util.dll.csproj b/mcs/nunit20/util/nunit.util.dll.csproj
new file mode 100755 (executable)
index 0000000..0b7aaaa
--- /dev/null
@@ -0,0 +1,188 @@
+<VisualStudioProject>
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.0.9466"
+        SchemaVersion = "1.0"
+        ProjectGuid = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "nunit.util"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                RootNamespace = "NUnit.Util"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE;NUNIT_LEAKAGE_TEST"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "true"
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
+                />
+                <Reference
+                    Name = "System.Data"
+                    AssemblyName = "System.Data"
+                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
+                />
+                <Reference
+                    Name = "System.XML"
+                    AssemblyName = "System.Xml"
+                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
+                />
+                <Reference
+                    Name = "nunit.framework.dll"
+                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
+                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
+                />
+                <Reference
+                    Name = "System.Windows.Forms"
+                    AssemblyName = "System.Windows.Forms"
+                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll"
+                />
+                <Reference
+                    Name = "System.Drawing"
+                    AssemblyName = "System.Drawing"
+                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "AssemblyInfo.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "AssemblyWatcher.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "CommandLineOptions.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ConsoleOptions.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "FormSettings.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "GuiOptions.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "NUnitGuiSettings.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "NUnitRegistry.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "OptionSettings.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "RecentAssemblySettings.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "RegistrySettingsStorage.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "SettingsGroup.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "SettingsStorage.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "TestEventArgs.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "TestLoadEventArgs.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "UIHelper.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "UITestNode.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "UserSettings.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+