Index: E:/Source/OpenSource/ccnet-svn-trunk/project/core/tasks/DevenvTask.cs
===================================================================
--- E:/Source/OpenSource/ccnet-svn-trunk/project/core/tasks/DevenvTask.cs (revision 3607)
+++ E:/Source/OpenSource/ccnet-svn-trunk/project/core/tasks/DevenvTask.cs (working copy)
@@ -22,6 +22,7 @@
private IRegistry registry;
private ProcessExecutor executor;
private string executable;
+ private string version;
public DevenvTask() : this(new Registry(), new ProcessExecutor()) { }
@@ -31,6 +32,29 @@
this.executor = executor;
}
+ [ReflectorProperty("version", Required = false)]
+ public string Version
+ {
+ get { return version; }
+
+ set
+ {
+ if (value != "9.0" &&
+ value != "8.0" &&
+ value != "7.1" &&
+ value != "7.0" &&
+ value != "VS2008" &&
+ value != "VS2005" &&
+ value != "VS2003" &&
+ value != "VS2002")
+ {
+ throw new CruiseControlException("Invalid value for Version, expected one of 9.0, 8.0, 7.1, 7.0, VS2008, VS2005, VS2003 or VS2002");
+ }
+
+ version = value;
+ }
+ }
+
[ReflectorProperty("executable", Required=false)]
public string Executable
{
@@ -51,20 +75,50 @@
/// The fully-qualified pathname of the executable.
private string ReadDevenvExecutableFromRegistry()
{
- string registryValue;
- registryValue = registry.GetLocalMachineSubKeyValue(VS2008_REGISTRY_PATH, VS_REGISTRY_KEY);
- if (registryValue == null)
- {
- registryValue = registry.GetLocalMachineSubKeyValue(VS2005_REGISTRY_PATH, VS_REGISTRY_KEY);
- }
- if (registryValue == null)
- {
- registryValue = registry.GetLocalMachineSubKeyValue(VS2003_REGISTRY_PATH, VS_REGISTRY_KEY);
- }
- if (registryValue == null)
+ string registryValue = null;
+
+ if (Version == null)
{
- registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2002_REGISTRY_PATH, VS_REGISTRY_KEY);
+ registryValue = registry.GetLocalMachineSubKeyValue(VS2008_REGISTRY_PATH, VS_REGISTRY_KEY);
+
+ if (registryValue == null)
+ {
+ registryValue = registry.GetLocalMachineSubKeyValue(VS2005_REGISTRY_PATH, VS_REGISTRY_KEY);
+ }
+
+ if (registryValue == null)
+ {
+ registryValue = registry.GetLocalMachineSubKeyValue(VS2003_REGISTRY_PATH, VS_REGISTRY_KEY);
+ }
+
+ if (registryValue == null)
+ {
+ registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2002_REGISTRY_PATH, VS_REGISTRY_KEY);
+ }
}
+ else
+ {
+ if (Version == "9.0" || Version == "VS2008")
+ {
+ registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2008_REGISTRY_PATH, VS_REGISTRY_KEY);
+ }
+
+ if (Version == "8.0" || Version == "VS2005")
+ {
+ registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2005_REGISTRY_PATH, VS_REGISTRY_KEY);
+ }
+
+ if (Version == null || Version == "7.1" || Version == "VS2003")
+ {
+ registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2003_REGISTRY_PATH, VS_REGISTRY_KEY);
+ }
+
+ if (Version == null || Version == "7.0" || Version == "VS2002")
+ {
+ registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2002_REGISTRY_PATH, VS_REGISTRY_KEY);
+ }
+ }
+
return Path.Combine(registryValue, DEVENV_EXE);
}
Index: E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/Tasks/DevenvTaskTest.cs
===================================================================
--- E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/Tasks/DevenvTaskTest.cs (revision 3607)
+++ E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/Tasks/DevenvTaskTest.cs (working copy)
@@ -14,6 +14,12 @@
public class DevenvTaskTest : ProcessExecutorTestFixtureBase
{
private const string DEVENV_PATH = @"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.com";
+
+ private const string DEVENV_2008_PATH = @"C:\Program Files\Microsoft Visual Studio 9\Common7\IDE\";
+ private const string DEVENV_2005_PATH = @"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\";
+ private const string DEVENV_2003_PATH = @"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\";
+ private const string DEVENV_2002_PATH = @"C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\";
+
private const string SOLUTION_FILE = @"D:\dev\ccnet\ccnet\project\ccnet.sln";
private const string CONFIGURATION = "Debug";
@@ -41,6 +47,7 @@
string xml = @"
c:\vs.net\devenv.com
+ 9.0
mySolution.sln
Debug
4
@@ -69,19 +76,58 @@
Assert.AreEqual(@"", task2.Project);
}
+ [Test, ExpectedException(typeof (NetReflectorException))]
+ public void ShouldFailToLoadInvalidVersionFromConfiguration()
+ {
+ string xml = @"";
+ DevenvTask task2 = (DevenvTask)NetReflector.Read(xml);
+ }
+
[Test]
public void DefaultVisualStudioShouldBe2008IfInstalled()
{
IMock mockRegistry2 = new DynamicMock(typeof(IRegistry));
DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
- mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", @"C:\Program Files\Microsoft Visual Studio 9\Common7\IDE\",
+ mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", DEVENV_2008_PATH,
DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
- Assert.AreEqual(@"C:\Program Files\Microsoft Visual Studio 9\Common7\IDE\devenv.com", task2.Executable);
+ Assert.AreEqual(DEVENV_2008_PATH + "devenv.com", task2.Executable);
mockRegistry2.Verify();
mockProcessExecutor.Verify();
}
+ [Test]
+ public void SelectVisualStudio2008ExplicitlyUsingVersionNumberWhenEverythingInstalled()
+ {
+ IMock mockRegistry2 = new DynamicMock(typeof(IRegistry));
+
+ DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
+ mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2008_PATH,
+ DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
+
+ task2.Version = "9.0";
+
+ Assert.AreEqual(DEVENV_2008_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
+ mockProcessExecutor.Verify();
+ }
+
+ [Test]
+ public void SelectVisualStudio2008ExplicitlyUsingVersionNameWhenEverythingInstalled()
+ {
+ IMock mockRegistry2 = new DynamicMock(typeof(IRegistry));
+
+ DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
+ mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2008_PATH,
+ DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
+
+ task2.Version = "VS2008";
+
+ Assert.AreEqual(DEVENV_2008_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
+ mockProcessExecutor.Verify();
+ }
+
[Test]
public void DefaultVisualStudioShouldBe2005IfNothingNewerInstalled()
{
@@ -89,13 +135,45 @@
DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
- mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", @"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\",
+ mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", DEVENV_2005_PATH,
DevenvTask.VS2005_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
- Assert.AreEqual(@"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com", task2.Executable);
- mockRegistry2.Verify();
+ Assert.AreEqual(DEVENV_2005_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
mockProcessExecutor.Verify();
}
+ [Test]
+ public void SelectVisualStudio2005ExplicitlyUsingVersionNumberWhenEverythingInstalled()
+ {
+ IMock mockRegistry2 = new DynamicMock(typeof(IRegistry));
+
+ DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
+ mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2005_PATH,
+ DevenvTask.VS2005_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
+
+ task2.Version = "8.0";
+
+ Assert.AreEqual(DEVENV_2005_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
+ mockProcessExecutor.Verify();
+ }
+
+ [Test]
+ public void SelectVisualStudio2005ExplicitlyUsingVersionNameWhenEverythingInstalled()
+ {
+ IMock mockRegistry2 = new DynamicMock(typeof(IRegistry));
+
+ DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
+ mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2005_PATH,
+ DevenvTask.VS2005_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
+
+ task2.Version = "VS2005";
+
+ Assert.AreEqual(DEVENV_2005_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
+ mockProcessExecutor.Verify();
+ }
+
[Test]
public void DefaultVisualStudioShouldBe2003IfNothingNewerInstalled()
{
@@ -104,14 +182,46 @@
DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2005_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
- mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", @"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\",
- DevenvTask.VS2003_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
- Assert.AreEqual(@"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.com", task2.Executable);
- mockRegistry2.Verify();
+ mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", DEVENV_2003_PATH,
+ DevenvTask.VS2003_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
+ Assert.AreEqual(DEVENV_2003_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
mockProcessExecutor.Verify();
}
[Test]
+ public void SelectVisualStudio2003ExplicitlyUsingVersionNumberWhenEverythingInstalled()
+ {
+ IMock mockRegistry2 = new DynamicMock(typeof(IRegistry));
+
+ DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
+ mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2003_PATH,
+ DevenvTask.VS2003_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
+
+ task2.Version = "7.1";
+
+ Assert.AreEqual(DEVENV_2003_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
+ mockProcessExecutor.Verify();
+ }
+
+ [Test]
+ public void SelectVisualStudio2003ExplicitlyUsingVersionNameWhenEverythingInstalled()
+ {
+ IMock mockRegistry2 = new DynamicMock(typeof(IRegistry));
+
+ DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
+ mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2003_PATH,
+ DevenvTask.VS2003_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
+
+ task2.Version = "VS2003";
+
+ Assert.AreEqual(DEVENV_2003_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
+ mockProcessExecutor.Verify();
+ }
+
+ [Test]
public void DefaultVisualStudioShouldBe2002IfNothingNewerInstalled()
{
IMock mockRegistry2 = new DynamicMock(typeof(IRegistry));
@@ -120,14 +230,47 @@
mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2005_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2003_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
- mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", @"C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\",
- DevenvTask.VS2002_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
- Assert.AreEqual(@"C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\devenv.com", task2.Executable);
- mockRegistry2.Verify();
+ mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2002_PATH,
+ DevenvTask.VS2002_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
+
+ Assert.AreEqual(DEVENV_2002_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
mockProcessExecutor.Verify();
}
[Test]
+ public void SelectVisualStudio2002ExplicitlyUsingVersionNumberWhenEverythingInstalled()
+ {
+ IMock mockRegistry2 = new DynamicMock(typeof(IRegistry));
+
+ DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
+ mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2002_PATH,
+ DevenvTask.VS2002_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
+
+ task2.Version = "7.0";
+
+ Assert.AreEqual(DEVENV_2002_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
+ mockProcessExecutor.Verify();
+ }
+
+ [Test]
+ public void SelectVisualStudio2002ExplicitlyUsingVersionNameWhenEverythingInstalled()
+ {
+ IMock mockRegistry2 = new DynamicMock(typeof(IRegistry));
+
+ DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance);
+ mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2002_PATH,
+ DevenvTask.VS2002_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY);
+
+ task2.Version = "VS2002";
+
+ Assert.AreEqual(DEVENV_2002_PATH + "devenv.com", task2.Executable);
+ mockRegistry2.Verify();
+ mockProcessExecutor.Verify();
+ }
+
+ [Test]
public void VerifyDevenvProcessInfo()
{
CollectingConstraint constraint = new CollectingConstraint();