diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs
index a9ebf35b07..3948833f90 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs
@@ -119,8 +119,6 @@ namespace Debugger
Wrappers.ResourceManager.TraceMessagesEnabled = false;
TraceMessage("Tracked COM objects released");
-
- noProcessesHandle.Set();
}
///
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Process-StateControl.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Process-StateControl.cs
index b21bd739a3..f4eea14c2b 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Process-StateControl.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Process-StateControl.cs
@@ -13,7 +13,8 @@ namespace Debugger
public partial class Process
{
bool pauseOnHandledException = false;
- internal ManualResetEvent pausedHandle = new ManualResetEvent(false);
+ ManualResetEvent exited = new ManualResetEvent(false);
+ ManualResetEvent pausedHandle = new ManualResetEvent(false);
DebugeeState debugeeState;
@@ -136,17 +137,17 @@ namespace Debugger
///
public void WaitForPause()
{
- if (debugger.MTA2STA.SoftWait(PausedHandle, debugger.noProcessesHandle) == 1) {
+ if (debugger.MTA2STA.SoftWait(PausedHandle, exited) == 1) {
throw new DebuggerException("Process exited before pausing");
}
}
///
- /// Waits until all debugged precesses exit. Returns imideately if there are no running processes.
+ /// Waits until the precesses exits.
///
- public void WaitForPrecessExit()
+ public void WaitForExit()
{
- debugger.MTA2STA.SoftWait(debugger.noProcessesHandle);
+ debugger.MTA2STA.SoftWait(exited);
}
///
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs
index f73d387789..a50cbb4979 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs
@@ -512,7 +512,13 @@ namespace Debugger
}
/// Gets all local variables of the function.
- public IEnumerable LocalVariables {
+ public NamedValueCollection LocalVariables {
+ get {
+ return new NamedValueCollection(LocalVariablesEnum);
+ }
+ }
+
+ IEnumerable LocalVariablesEnum {
get {
if (symMethod != null) { // TODO: Is this needed?
ISymUnmanagedScope symRootScope = symMethod.RootScope;
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/NDebugger-Processes.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/NDebugger-Processes.cs
index 5c6d33a430..9690749200 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/NDebugger-Processes.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/NDebugger-Processes.cs
@@ -17,9 +17,6 @@ namespace Debugger
{
List processCollection = new List();
- // Is set as long as the process count is zero
- internal ManualResetEvent noProcessesHandle = new ManualResetEvent(true);
-
public event EventHandler ProcessStarted;
public event EventHandler ProcessExited;
@@ -43,14 +40,12 @@ namespace Debugger
{
processCollection.Add(process);
OnProcessStarted(process);
- noProcessesHandle.Reset();
}
internal void RemoveProcess(Process process)
{
processCollection.Remove(process);
OnProcessExited(process);
- // noProcessesHandle is set in NDebugger.TerminateDebugger
if (processCollection.Count == 0) {
// Exit callback and then terminate the debugger
this.MTA2STA.AsyncCall( delegate { this.TerminateDebugger(); } );
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs
index c323e1393d..0a18733adc 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs
@@ -41,6 +41,7 @@ namespace Debugger
if (Expired != null) {
Expired(this, new ProcessEventArgs(this));
}
+ exited.Set();
debugger.RemoveProcess(this);
}
}
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Values/NamedValueCollection.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Values/NamedValueCollection.cs
index 618a27edb2..8178d4592b 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Values/NamedValueCollection.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Values/NamedValueCollection.cs
@@ -18,41 +18,61 @@ namespace Debugger
{
internal static NamedValueCollection Empty = new NamedValueCollection(new NamedValue[0]);
- Dictionary> collection = new Dictionary>();
+ List list = new List();
+ Dictionary> hashtable = new Dictionary>();
IEnumerator IEnumerable.GetEnumerator()
{
- foreach(KeyValuePair> kvp in collection) {
- foreach(NamedValue namedValue in kvp.Value) {
- yield return namedValue;
- }
+ foreach(NamedValue namedValue in list) {
+ yield return namedValue;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
- return ((IEnumerable)this).GetEnumerator();
+ foreach(NamedValue namedValue in list) {
+ yield return namedValue;
+ }
}
internal NamedValueCollection(IEnumerable namedValues)
{
foreach(NamedValue namedValue in namedValues) {
string name = namedValue.Name;
- if (collection.ContainsKey(name)) {
- collection[name].Add(namedValue);
+ if (hashtable.ContainsKey(name)) {
+ hashtable[name].Add(namedValue);
} else {
- collection[name] = new List(new NamedValue[] {namedValue});
+ hashtable[name] = new List(new NamedValue[] {namedValue});
}
+ list.Add(namedValue);
+ }
+ }
+
+ ///
+ /// Gets number of named values contained in the collection
+ ///
+ public int Count {
+ get {
+ return list.Count;
+ }
+ }
+
+ ///
+ /// Gets a value by index
+ ///
+ public NamedValue this[int i] {
+ get {
+ return list[i];
}
}
///
/// Gets a value by its name.
///
- public virtual NamedValue this[string variableName] {
+ public NamedValue this[string variableName] {
get {
- if (collection.ContainsKey(variableName)) {
- foreach(NamedValue namedValue in collection[variableName]) {
+ if (hashtable.ContainsKey(variableName)) {
+ foreach(NamedValue namedValue in hashtable[variableName]) {
return namedValue;
}
}
diff --git a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj
index 3d01346248..079078fdec 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj
+++ b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj
@@ -63,10 +63,6 @@
-
- {EC06F96A-AEEC-49D6-B03D-AB87C6EB674C}
- Debugger.AddIn
-
{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}
Debugger.Core
diff --git a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs
index eb1d9e165c..50feaa63f3 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs
@@ -6,6 +6,7 @@
//
using Debugger;
+using Debugger.Interop;
using Microsoft.CSharp;
using NUnit.Framework;
using System;
@@ -25,578 +26,547 @@ namespace Debugger.Tests
[TestFixture]
public class DebuggerTests
{
-// NDebugger debugger;
-// string log;
-// string lastLogMessage;
-// string assemblyFilename;
-// string assemblyDir;
-// string symbolsFilename;
-//
-// public DebuggerTests()
-// {
-// assemblyFilename = Assembly.GetExecutingAssembly().Location;
-// assemblyDir = Path.GetDirectoryName(assemblyFilename);
-// symbolsFilename = Path.Combine(assemblyDir, Path.GetFileNameWithoutExtension(assemblyFilename) + ".pdb");
-//
-// debugger = new NDebugger();
-// debugger.MTA2STA.CallMethod = CallMethod.Manual;
-// debugger.LogMessage += delegate(object sender, MessageEventArgs e) {
-// log += e.Message;
-// lastLogMessage = e.Message;
-// };
-// }
-//
-// [TearDown]
-// public void TearDown()
-// {
-// debugger.Terminate();
-// }
-//
-// void StartProgram(string programName)
-// {
-// StartProgram(assemblyFilename, programName);
-// }
-//
-// void StartProgram(string exeFilename, string programName)
-// {
-// log = "";
-// lastLogMessage = null;
-// debugger.Terminate();
-// debugger.Start(exeFilename, Path.GetDirectoryName(exeFilename), programName);
-// }
-//
-// void WaitForPause(PausedReason expectedReason)
-// {
-// debugger.WaitForPause();
-// Assert.AreEqual(true, debugger.IsPaused);
-// Assert.AreEqual(expectedReason, debugger.PausedReason);
-// }
-//
-// void WaitForPause(PausedReason expectedReason, string expectedLastLogMessage)
-// {
-// WaitForPause(expectedReason);
-// if (expectedLastLogMessage != null) expectedLastLogMessage += "\r\n";
-// Assert.AreEqual(expectedLastLogMessage, lastLogMessage);
-// }
-//
-//
-// [Test]
-// public void SimpleProgram()
-// {
-// StartProgram("SimpleProgram");
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void HelloWorld()
-// {
-// StartProgram("HelloWorld");
-// debugger.WaitForPrecessExit();
-// Assert.AreEqual("Hello world!\r\n", log);
-// }
-//
-// [Test]
-// public void Break()
-// {
-// StartProgram("Break");
-// WaitForPause(PausedReason.Break, null);
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void Symbols()
-// {
-// Assert.AreEqual("debugger.tests.exe", Path.GetFileName(assemblyFilename).ToLower());
-// Assert.IsTrue(File.Exists(symbolsFilename), "Symbols file not found (.pdb)");
-//
-// StartProgram("Symbols");
-// WaitForPause(PausedReason.Break, null);
-// Assert.AreEqual(true, debugger.GetModule(Path.GetFileName(assemblyFilename)).SymbolsLoaded, "Module symbols not loaded");
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void Breakpoint()
-// {
-// Breakpoint b = debugger.AddBreakpoint(@"D:\corsavy\SharpDevelop\src\AddIns\Misc\Debugger\Debugger.Tests\Project\Src\TestPrograms\Breakpoint.cs", 18);
-//
-// StartProgram("Breakpoint");
-// WaitForPause(PausedReason.Break, null);
-// Assert.AreEqual(true, b.Enabled);
-// Assert.AreEqual(true, b.HadBeenSet, "Breakpoint is not set");
-// Assert.AreEqual(18, b.SourcecodeSegment.StartLine);
-//
-// debugger.Continue();
-// WaitForPause(PausedReason.Breakpoint, "Mark 1");
-//
-// debugger.Continue();
-// WaitForPause(PausedReason.Break, "Mark 2");
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// Assert.AreEqual("Mark 1\r\nMark 2\r\n", log);
-// }
-//
-// [Test]
-// public void FileRelease()
-// {
-// Assert.IsTrue(File.Exists(assemblyFilename), "Assembly file not found");
-// Assert.IsTrue(File.Exists(symbolsFilename), "Symbols file not found (.pdb)");
-//
-// string tempPath = Path.Combine(Path.GetTempPath(), Path.Combine("DebeggerTest", new Random().Next().ToString()));
-// Directory.CreateDirectory(tempPath);
-//
-// string newAssemblyFilename = Path.Combine(tempPath, Path.GetFileName(assemblyFilename));
-// string newSymbolsFilename = Path.Combine(tempPath, Path.GetFileName(symbolsFilename));
-//
-// File.Copy(assemblyFilename, newAssemblyFilename);
-// File.Copy(symbolsFilename, newSymbolsFilename);
-//
-// Assert.IsTrue(File.Exists(newAssemblyFilename), "Assembly file copying failed");
-// Assert.IsTrue(File.Exists(newSymbolsFilename), "Symbols file copying failed");
-//
-// StartProgram(newAssemblyFilename, "FileRelease");
-// debugger.WaitForPrecessExit();
-//
-// try {
-// File.Delete(newAssemblyFilename);
-// } catch (System.Exception e) {
-// Assert.Fail("Assembly file not released\n" + e.ToString());
+ NDebugger debugger;
+ string assemblyFilename;
+ string assemblyDir;
+ string symbolsFilename;
+
+ Process process;
+ string log;
+ string lastLogMessage;
+
+ [TestFixtureSetUp]
+ public void TestFixtureSetUp()
+ {
+ assemblyFilename = Assembly.GetExecutingAssembly().Location;
+ assemblyDir = Path.GetDirectoryName(assemblyFilename);
+ symbolsFilename = Path.Combine(assemblyDir, Path.GetFileNameWithoutExtension(assemblyFilename) + ".pdb");
+
+ debugger = new NDebugger();
+ debugger.MTA2STA.CallMethod = CallMethod.Manual;
+ }
+
+ [TestFixtureTearDown]
+ public void TestFixtureTearDown()
+ {
+
+ }
+
+ [TearDown]
+ public void TearDown()
+ {
+// foreach(Process process in debugger.Processes) {
+// process.Terminate();
+// process.WaitForExit();
// }
-//
-// try {
-// File.Delete(newSymbolsFilename);
-// } catch (System.Exception e) {
-// Assert.Fail("Symbols file not released\n" + e.ToString());
-// }
-// }
-//
-// [Test]
-// public void DebuggeeKilled()
-// {
-// StartProgram("DebuggeeKilled");
-// WaitForPause(PausedReason.Break);
-// Assert.AreNotEqual(null, lastLogMessage);
-// System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(int.Parse(lastLogMessage));
-// p.Kill();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void Stepping()
-// {
-// StartProgram("Stepping");
-// WaitForPause(PausedReason.Break, null);
-//
-// debugger.StepOver(); // Debugger.Break
-// WaitForPause(PausedReason.StepComplete, null);
-//
-// debugger.StepOver(); // Debug.WriteLine 1
-// WaitForPause(PausedReason.StepComplete, "1");
-//
-// debugger.StepInto(); // Method Sub
-// WaitForPause(PausedReason.StepComplete, "1");
-//
-// debugger.StepInto(); // '{'
-// WaitForPause(PausedReason.StepComplete, "1");
-//
-// debugger.StepInto(); // Debug.WriteLine 2
-// WaitForPause(PausedReason.StepComplete, "2");
-//
-// debugger.StepOut(); // Method Sub
-// WaitForPause(PausedReason.StepComplete, "4");
-//
-// debugger.StepOver(); // Method Sub
-// WaitForPause(PausedReason.StepComplete, "4");
-//
-// debugger.StepOver(); // Method Sub2
-// WaitForPause(PausedReason.StepComplete, "5");
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void Callstack()
-// {
-// List callstack;
-//
-// StartProgram("Callstack");
-// WaitForPause(PausedReason.Break, null);
-// callstack = new List(debugger.SelectedThread.Callstack);
-// Assert.AreEqual("Sub2", callstack[0].Name);
-// Assert.AreEqual("Sub1", callstack[1].Name);
-// Assert.AreEqual("Main", callstack[2].Name);
-//
-// debugger.StepOut();
-// WaitForPause(PausedReason.StepComplete, null);
-// callstack = new List(debugger.SelectedThread.Callstack);
-// Assert.AreEqual("Sub1", callstack[0].Name);
-// Assert.AreEqual("Main", callstack[1].Name);
-//
-// debugger.StepOut();
-// WaitForPause(PausedReason.StepComplete, null);
-// callstack = new List(debugger.SelectedThread.Callstack);
-// Assert.AreEqual("Main", callstack[0].Name);
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void FunctionArgumentVariables()
-// {
-// List args;
-//
-// StartProgram("FunctionArgumentVariables");
-// WaitForPause(PausedReason.Break, null);
-//
-// for(int i = 0; i < 2; i++) {
-// debugger.Continue();
-// WaitForPause(PausedReason.Break, null);
-// args = new List(debugger.SelectedFunction.ArgumentVariables);
-// // names
-// Assert.AreEqual("i", args[0].Name);
-// Assert.AreEqual("s", args[1].Name);
-// Assert.AreEqual("args", args[2].Name);
-// // types
-// Assert.AreEqual(typeof(PrimitiveValue), args[0].Value.GetType());
-// Assert.AreEqual(typeof(PrimitiveValue), args[1].Value.GetType());
-// Assert.AreEqual(typeof(ArrayValue), args[2].Value.GetType());
-// // values
-// Assert.AreEqual("0", args[0].Value.AsString);
-// Assert.AreEqual("S", args[1].Value.AsString);
-// Assert.AreEqual(0 ,((ArrayValue)args[2].Value).Lenght);
-//
-// debugger.Continue();
-// WaitForPause(PausedReason.Break, null);
-// args = new List(debugger.SelectedFunction.ArgumentVariables);
-// // types
-// Assert.AreEqual(typeof(PrimitiveValue), args[0].Value.GetType());
-// Assert.AreEqual(typeof(PrimitiveValue), args[1].Value.GetType());
-// Assert.AreEqual(typeof(ArrayValue), args[2].Value.GetType());
-// // values
-// Assert.AreEqual("1", args[0].Value.AsString);
-// Assert.AreEqual("S", args[1].Value.AsString);
-// Assert.AreEqual(1 ,((ArrayValue)args[2].Value).Lenght);
-//
-// debugger.Continue();
-// WaitForPause(PausedReason.Break, null);
-// args = new List(debugger.SelectedFunction.ArgumentVariables);
-// // types
-// Assert.AreEqual(typeof(PrimitiveValue), args[0].Value.GetType());
-// Assert.AreEqual(typeof(NullValue), args[1].Value.GetType());
-// Assert.AreEqual(typeof(ArrayValue), args[2].Value.GetType());
-// // values
-// Assert.AreEqual("2", args[0].Value.AsString);
-// Assert.IsNotNull(args[1].Value.AsString);
-// Assert.AreEqual(2 ,((ArrayValue)args[2].Value).Lenght);
-// }
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void FunctionLocalVariables()
-// {
-// List args;
-//
-// StartProgram("FunctionLocalVariables");
-// WaitForPause(PausedReason.Break, null);
-// args = new List(debugger.SelectedFunction.LocalVariables);
-// // names
-// Assert.AreEqual("i", args[0].Name);
-// Assert.AreEqual("s", args[1].Name);
-// Assert.AreEqual("args", args[2].Name);
-// Assert.AreEqual("n", args[3].Name);
-// Assert.AreEqual("o", args[4].Name);
-// // types
-// Assert.AreEqual(typeof(PrimitiveValue), args[0].Value.GetType());
-// Assert.AreEqual(typeof(PrimitiveValue), args[1].Value.GetType());
-// Assert.AreEqual(typeof(ArrayValue), args[2].Value.GetType());
-// Assert.AreEqual(typeof(NullValue), args[3].Value.GetType());
-// Assert.AreEqual(typeof(ObjectValue), args[4].Value.GetType());
-// // values
-// Assert.AreEqual("0", args[0].Value.AsString);
-// Assert.AreEqual("S", args[1].Value.AsString);
-// Assert.AreEqual(1 ,((ArrayValue)args[2].Value).Lenght);
-// Assert.IsNotNull(args[3].Value.AsString);
-// Assert.AreEqual("{System.Object}", args[4].Value.AsString);
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void FunctionLifetime()
-// {
-// Function function;
-//
-// StartProgram("FunctionLifetime");
-// WaitForPause(PausedReason.Break, null);
-// function = debugger.SelectedFunction;
-// Assert.IsNotNull(function);
-// Assert.AreEqual("Function", function.Name);
-// Assert.AreEqual(false, function.HasExpired);
-// Assert.AreEqual("1", function.GetArgumentVariable(0).Value.AsString);
-//
-// debugger.Continue(); // Go to the SubFunction
-// WaitForPause(PausedReason.Break, null);
-// Assert.AreEqual("SubFunction", debugger.SelectedFunction.Name);
-// Assert.AreEqual(false, function.HasExpired);
-// Assert.AreEqual("1", function.GetArgumentVariable(0).Value.AsString);
-//
-// debugger.Continue(); // Go back to Function
-// WaitForPause(PausedReason.Break, null);
-// Assert.AreEqual("Function", debugger.SelectedFunction.Name);
-// Assert.AreEqual(false, function.HasExpired);
-// Assert.AreEqual("1", function.GetArgumentVariable(0).Value.AsString);
-//
-// debugger.Continue(); // Setp out of function
-// WaitForPause(PausedReason.Break, null);
-// Assert.AreEqual("Main", debugger.SelectedFunction.Name);
-// Assert.AreEqual(true, function.HasExpired);
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void FunctionVariablesLifetime()
-// {
-// Function function = null;
-// Variable argument = null;
-// Variable local = null;
-// Variable localInSubFunction = null;
-// Variable @class = null;
-//
-// StartProgram("FunctionVariablesLifetime"); // 1 - Enter program
-// WaitForPause(PausedReason.Break, null);
-// function = debugger.SelectedFunction;
-// Assert.IsNotNull(function);
-// Assert.AreEqual("Function", function.Name);
-// argument = function.GetArgumentVariable(0);
-// foreach(Variable var in function.LocalVariables) {
-// local = var;
-// }
-// foreach(Variable var in function.ContaingClassVariables) {
-// @class = var;
-// }
-// Assert.IsNotNull(argument);
-// Assert.IsNotNull(local);
-// Assert.IsNotNull(@class);
-// Assert.AreEqual("argument", argument.Name);
-// Assert.AreEqual("local", local.Name);
-// Assert.AreEqual("class", @class.Name);
-// Assert.AreEqual("1", argument.Value.AsString);
-// Assert.AreEqual("2", local.Value.AsString);
-// Assert.AreEqual("3", @class.Value.AsString);
-//
-// debugger.Continue(); // 2 - Go to the SubFunction
-// WaitForPause(PausedReason.Break, null);
-// Assert.AreEqual("1", argument.Value.AsString);
-// Assert.AreEqual("2", local.Value.AsString);
-// Assert.AreEqual("3", @class.Value.AsString);
-// // Check localInSubFunction variable
-// localInSubFunction = debugger.LocalVariables["localInSubFunction"];
-// Assert.AreEqual("4", localInSubFunction.Value.AsString);
-//
-// debugger.Continue(); // 3 - Go back to Function
-// WaitForPause(PausedReason.Break, null);
-// Assert.AreEqual("1", argument.Value.AsString);
-// Assert.AreEqual("2", local.Value.AsString);
-// Assert.AreEqual("3", @class.Value.AsString);
-// // localInSubFunction should be dead now
-// Assert.AreEqual(typeof(UnavailableValue), localInSubFunction.Value.GetType());
-//
-// debugger.Continue(); // 4 - Go to the SubFunction
-// WaitForPause(PausedReason.Break, null);
-// Assert.AreEqual("1", argument.Value.AsString);
-// Assert.AreEqual("2", local.Value.AsString);
-// Assert.AreEqual("3", @class.Value.AsString);
-// // localInSubFunction should be still dead...
-// Assert.AreEqual(typeof(UnavailableValue), localInSubFunction.Value.GetType());
-// // ... , but we should able to get new one
-// localInSubFunction = debugger.LocalVariables["localInSubFunction"];
-// Assert.AreEqual("4", localInSubFunction.Value.AsString);
-//
-// debugger.Continue(); // 5 - Setp out of both functions
-// WaitForPause(PausedReason.Break, null);
-// Assert.AreEqual(typeof(UnavailableValue), argument.Value.GetType());
-// Assert.AreEqual(typeof(UnavailableValue), local.Value.GetType());
-// Assert.AreEqual(typeof(UnavailableValue), @class.Value.GetType());
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void ArrayValue()
-// {
-// Variable local = null;
-// List subVars = new List();
-//
-// StartProgram("ArrayValue");
-// WaitForPause(PausedReason.Break, null);
-// foreach(Variable var in debugger.SelectedFunction.LocalVariables) {
-// local = var; break;
-// }
-// Assert.AreEqual("array", local.Name);
-// Assert.AreEqual(true, local.Value.MayHaveSubVariables);
-// Assert.AreEqual(typeof(ArrayValue), local.Value.GetType());
-// Assert.AreEqual("{System.Int32[5]}", local.Value.AsString);
-// foreach(Variable var in local.Value.SubVariables) {
-// subVars.Add(var);
-// }
-// for(int i = 0; i < 5; i++) {
-// Assert.AreEqual("[" + i.ToString() + "]", subVars[i].Name);
-// Assert.AreEqual(i.ToString(), subVars[i].Value.AsString);
-// }
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void ObjectValue()
-// {
-// Variable local = null;
-// Variable baseClass;
-// List subVars = new List();
-//
-// StartProgram("ObjectValue");
-// WaitForPause(PausedReason.Break, null);
-// foreach(Variable var in debugger.SelectedFunction.LocalVariables) {
-// local = var;
-// }
-// Assert.AreEqual("val", local.Name);
-// Assert.AreEqual(true, local.Value.MayHaveSubVariables);
-// Assert.AreEqual(typeof(ObjectValue), local.Value.GetType());
-// Assert.AreEqual("{Debugger.Tests.TestPrograms.ObjectValue}", local.Value.AsString);
-// foreach(Variable var in local.Value.SubVariables) {
-// subVars.Add(var);
-// }
-// Assert.AreEqual("privateField", subVars[1].Name);
-// Assert.AreEqual("publicFiled", subVars[2].Name);
-// Assert.AreEqual("PublicProperty", subVars[3].Name);
-// Assert.AreEqual(typeof(Variable), subVars[1].GetType());
-// Assert.AreEqual(typeof(Variable), subVars[2].GetType());
-// Assert.AreEqual(typeof(Variable), subVars[3].GetType());
-// Assert.AreEqual(false, ((Variable)subVars[1]).IsPublic);
-// Assert.AreEqual(true, ((Variable)subVars[2]).IsPublic);
-// Assert.AreEqual(true, ((Variable)subVars[3]).IsPublic);
-// baseClass = subVars[0];
-// Assert.AreEqual(typeof(ObjectValue), baseClass.Value.GetType());
-// Assert.AreEqual("{Debugger.Tests.TestPrograms.BaseClass}", baseClass.Value.AsString);
-//
-// debugger.Continue();
-// WaitForPause(PausedReason.Break, null);
-// Assert.AreEqual(typeof(ObjectValue), baseClass.Value.GetType());
-// Assert.AreEqual("{Debugger.Tests.TestPrograms.BaseClass}", baseClass.Value.AsString);
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void PropertyVariable()
-// {
-// Variable local = null;
-// List subVars = new List();
-//
-// StartProgram("PropertyVariable");
-// WaitForPause(PausedReason.Break, null);
-// foreach(Variable var in debugger.SelectedFunction.LocalVariables) {
-// local = var;
-// }
-// foreach(Variable var in local.Value.SubVariables) {
-// subVars.Add(var);
-// }
-// Assert.AreEqual("PrivateProperty", subVars[1].Name);
-// Assert.AreEqual("PublicProperty", subVars[2].Name);
-// Assert.AreEqual("ExceptionProperty", subVars[3].Name);
-// Assert.AreEqual("StaticProperty", subVars[4].Name);
-//
-// Assert.AreEqual(typeof(UnavailableValue), subVars[1].Value.GetType());
-// debugger.StartEvaluation();
-// WaitForPause(PausedReason.EvalComplete, null);
-// Assert.AreEqual("private", subVars[1].Value.AsString);
-//
-// Assert.AreEqual(typeof(UnavailableValue), subVars[2].Value.GetType());
-// debugger.StartEvaluation();
-// WaitForPause(PausedReason.EvalComplete, null);
-// Assert.AreEqual("public", subVars[2].Value.AsString);
-//
-// Assert.AreEqual(typeof(UnavailableValue), subVars[3].Value.GetType());
-// debugger.StartEvaluation();
-// WaitForPause(PausedReason.EvalComplete, null);
-// Assert.AreEqual(typeof(UnavailableValue), subVars[3].Value.GetType());
-//
-// Assert.AreEqual(typeof(UnavailableValue), subVars[4].Value.GetType());
-// debugger.StartEvaluation();
-// WaitForPause(PausedReason.EvalComplete, null);
-// Assert.AreEqual("static", subVars[4].Value.AsString);
-//
-// debugger.Continue();
-// WaitForPause(PausedReason.Break, null);
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void PropertyVariableForm()
-// {
-// Variable local = null;
-//
-// StartProgram("PropertyVariableForm");
-// WaitForPause(PausedReason.Break, null);
-// foreach(Variable var in debugger.SelectedFunction.LocalVariables) {
-// local = var;
-// }
-// Assert.AreEqual("form", local.Name);
-// Assert.AreEqual(typeof(Variable), local.GetType());
-//
-// foreach(Variable var in local.Value.SubVariables) {
-// Assert.AreEqual(typeof(UnavailableValue), var.Value.GetType(), "Variable name: " + var.Name);
-// debugger.StartEvaluation();
-// WaitForPause(PausedReason.EvalComplete, null);
-// Assert.AreNotEqual(null, var.Value.AsString, "Variable name: " + var.Name);
-// }
-//
-// debugger.Continue();
-// WaitForPause(PausedReason.Break, null);
-//
-// foreach(Variable var in local.Value.SubVariables) {
-// Assert.AreEqual(typeof(UnavailableValue), var.Value.GetType(), "Variable name: " + var.Name);
-// }
-// debugger.StartEvaluation();
-// WaitForPause(PausedReason.EvalComplete, null);
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
-//
-// [Test]
-// public void SetIP()
-// {
-// StartProgram("SetIP");
-// WaitForPause(PausedReason.Break, "1");
-//
-// Assert.IsNotNull(debugger.SelectedFunction.CanSetIP("SetIP.cs", 16, 0));
-// Assert.IsNull(debugger.SelectedFunction.CanSetIP("SetIP.cs", 100, 0));
-// debugger.SelectedFunction.SetIP("SetIP.cs", 16, 0);
-// debugger.Continue();
-// WaitForPause(PausedReason.Break, "1");
-// Assert.AreEqual("1\r\n1\r\n", log);
-//
-// debugger.Continue();
-// debugger.WaitForPrecessExit();
-// }
+ }
+
+ void StartProgram(string programName)
+ {
+ StartProgram(assemblyFilename, programName);
+ }
+
+ void StartProgram(string exeFilename, string programName)
+ {
+ log = "";
+ lastLogMessage = null;
+ process = debugger.Start(exeFilename, Path.GetDirectoryName(exeFilename), programName);
+ process.LogMessage += delegate(object sender, MessageEventArgs e) {
+ log += e.Message;
+ lastLogMessage = e.Message;
+ };
+ }
+
+ void WaitForPause(PausedReason expectedReason)
+ {
+ process.WaitForPause();
+ Assert.AreEqual(true, process.IsPaused);
+ Assert.AreEqual(expectedReason, process.PausedReason);
+ }
+
+ void WaitForPause(PausedReason expectedReason, string expectedLastLogMessage)
+ {
+ WaitForPause(expectedReason);
+ if (expectedLastLogMessage != null) expectedLastLogMessage += "\r\n";
+ Assert.AreEqual(expectedLastLogMessage, lastLogMessage);
+ }
+
+
+ [Test]
+ public void SimpleProgram()
+ {
+ StartProgram("SimpleProgram");
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void HelloWorld()
+ {
+ StartProgram("HelloWorld");
+ process.WaitForExit();
+ Assert.AreEqual("Hello world!\r\n", log);
+ }
+
+ [Test]
+ public void Break()
+ {
+ StartProgram("Break");
+ WaitForPause(PausedReason.Break, null);
+
+ process.Continue();
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void Symbols()
+ {
+ Assert.AreEqual("debugger.tests.exe", Path.GetFileName(assemblyFilename).ToLower());
+ Assert.IsTrue(File.Exists(symbolsFilename), "Symbols file not found (.pdb)");
+
+ StartProgram("Symbols");
+ WaitForPause(PausedReason.Break, null);
+ Assert.AreEqual(true, process.GetModule(Path.GetFileName(assemblyFilename)).SymbolsLoaded, "Module symbols not loaded");
+
+ process.Continue();
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void Breakpoint()
+ {
+ Breakpoint b = debugger.AddBreakpoint(@"F:\SharpDevelopTrunk\src\AddIns\Misc\Debugger\Debugger.Tests\Project\Src\TestPrograms\Breakpoint.cs", 18);
+
+ StartProgram("Breakpoint");
+ WaitForPause(PausedReason.Break, null);
+ Assert.AreEqual(true, b.Enabled);
+ Assert.AreEqual(true, b.HadBeenSet, "Breakpoint is not set");
+ Assert.AreEqual(18, b.SourcecodeSegment.StartLine);
+
+ process.Continue();
+ WaitForPause(PausedReason.Breakpoint, "Mark 1");
+
+ process.Continue();
+ WaitForPause(PausedReason.Break, "Mark 2");
+
+ process.Continue();
+ process.WaitForExit();
+ Assert.AreEqual("Mark 1\r\nMark 2\r\n", log);
+ }
+
+ [Test]
+ public void FileRelease()
+ {
+ Assert.IsTrue(File.Exists(assemblyFilename), "Assembly file not found");
+ Assert.IsTrue(File.Exists(symbolsFilename), "Symbols file not found (.pdb)");
+
+ string tempPath = Path.Combine(Path.GetTempPath(), Path.Combine("DebeggerTest", new Random().Next().ToString()));
+ Directory.CreateDirectory(tempPath);
+
+ string newAssemblyFilename = Path.Combine(tempPath, Path.GetFileName(assemblyFilename));
+ string newSymbolsFilename = Path.Combine(tempPath, Path.GetFileName(symbolsFilename));
+
+ File.Copy(assemblyFilename, newAssemblyFilename);
+ File.Copy(symbolsFilename, newSymbolsFilename);
+
+ Assert.IsTrue(File.Exists(newAssemblyFilename), "Assembly file copying failed");
+ Assert.IsTrue(File.Exists(newSymbolsFilename), "Symbols file copying failed");
+
+ StartProgram(newAssemblyFilename, "FileRelease");
+ process.WaitForExit();
+
+ try {
+ File.Delete(newAssemblyFilename);
+ } catch (System.Exception e) {
+ Assert.Fail("Assembly file not released\n" + e.ToString());
+ }
+
+ try {
+ File.Delete(newSymbolsFilename);
+ } catch (System.Exception e) {
+ Assert.Fail("Symbols file not released\n" + e.ToString());
+ }
+ }
+
+ [Test]
+ public void DebuggeeKilled()
+ {
+ StartProgram("DebuggeeKilled");
+ WaitForPause(PausedReason.Break);
+ Assert.AreNotEqual(null, lastLogMessage);
+ System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(int.Parse(lastLogMessage));
+ p.Kill();
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void Stepping()
+ {
+ StartProgram("Stepping");
+ WaitForPause(PausedReason.Break, null);
+
+ process.StepOver(); // Debugger.Break
+ WaitForPause(PausedReason.StepComplete, null);
+
+ process.StepOver(); // Debug.WriteLine 1
+ WaitForPause(PausedReason.StepComplete, "1");
+
+ process.StepInto(); // Method Sub
+ WaitForPause(PausedReason.StepComplete, "1");
+
+ process.StepInto(); // '{'
+ WaitForPause(PausedReason.StepComplete, "1");
+
+ process.StepInto(); // Debug.WriteLine 2
+ WaitForPause(PausedReason.StepComplete, "2");
+
+ process.StepOut(); // Method Sub
+ WaitForPause(PausedReason.StepComplete, "4");
+
+ process.StepOver(); // Method Sub
+ WaitForPause(PausedReason.StepComplete, "4");
+
+ process.StepOver(); // Method Sub2
+ WaitForPause(PausedReason.StepComplete, "5");
+
+ process.Continue();
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void Callstack()
+ {
+ List callstack;
+
+ StartProgram("Callstack");
+ WaitForPause(PausedReason.Break, null);
+ callstack = new List(process.SelectedThread.Callstack);
+ Assert.AreEqual("Sub2", callstack[0].Name);
+ Assert.AreEqual("Sub1", callstack[1].Name);
+ Assert.AreEqual("Main", callstack[2].Name);
+
+ process.StepOut();
+ WaitForPause(PausedReason.StepComplete, null);
+ callstack = new List(process.SelectedThread.Callstack);
+ Assert.AreEqual("Sub1", callstack[0].Name);
+ Assert.AreEqual("Main", callstack[1].Name);
+
+ process.StepOut();
+ WaitForPause(PausedReason.StepComplete, null);
+ callstack = new List(process.SelectedThread.Callstack);
+ Assert.AreEqual("Main", callstack[0].Name);
+
+ process.Continue();
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void FunctionArgumentVariables()
+ {
+ StartProgram("FunctionArgumentVariables");
+ WaitForPause(PausedReason.Break, null);
+
+ for(int i = 0; i < 2; i++) {
+ NamedValueCollection args;
+
+ process.Continue();
+ WaitForPause(PausedReason.Break, null);
+ args = process.SelectedFunction.Arguments;
+ NamedValue args_i = args["i"];
+ NamedValue args_s = args["s"];
+ NamedValue args_args = args["args"];
+ // names
+ Assert.AreEqual("i", args_i.Name);
+ Assert.AreEqual("s", args_s.Name);
+ Assert.AreEqual("args", args_args.Name);
+ // types
+ Assert.IsTrue(args_i.IsPrimitive);
+ Assert.IsTrue(args_s.IsPrimitive);
+ Assert.IsTrue(args_args.IsArray);
+ // values
+ Assert.AreEqual("0", args_i.AsString);
+ Assert.AreEqual("S", args_s.AsString);
+ Assert.AreEqual(0, args_args.ArrayLenght);
+
+ process.Continue();
+ WaitForPause(PausedReason.Break, null);
+ args = process.SelectedFunction.Arguments;
+ // values
+ Assert.AreEqual("1", args["i"].AsString);
+ Assert.AreEqual("S", args["s"].AsString);
+ Assert.AreEqual(1, args["args"].ArrayLenght);
+
+ process.Continue();
+ WaitForPause(PausedReason.Break, null);
+ args = process.SelectedFunction.Arguments;
+ // values
+ Assert.AreEqual("2", args["i"].AsString);
+ Assert.IsTrue(args["s"].IsNull);
+ Assert.AreEqual(2, args["args"].ArrayLenght);
+ }
+
+ process.Continue();
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void FunctionLocalVariables()
+ {
+ StartProgram("FunctionLocalVariables");
+ WaitForPause(PausedReason.Break, null);
+ NamedValueCollection vars = process.SelectedFunction.LocalVariables;
+ // types
+ Assert.IsTrue(vars["i"].IsPrimitive);
+ Assert.IsTrue(vars["s"].IsPrimitive);
+ Assert.IsTrue(vars["args"].IsArray);
+ Assert.IsTrue(vars["n"].IsNull);
+ Assert.IsTrue(vars["o"].IsObject);
+ // values
+ Assert.AreEqual("0", vars["i"].AsString);
+ Assert.AreEqual("S", vars["s"].AsString);
+ Assert.AreEqual(1, vars["args"].ArrayLenght);
+ Assert.IsTrue(vars["n"].IsNull);
+ Assert.AreEqual("{System.Object}", vars["o"].AsString);
+
+ process.Continue();
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void FunctionLifetime()
+ {
+ Function function;
+
+ StartProgram("FunctionLifetime");
+ WaitForPause(PausedReason.Break, null);
+ function = process.SelectedFunction;
+ Assert.IsNotNull(function);
+ Assert.AreEqual("Function", function.Name);
+ Assert.AreEqual(false, function.HasExpired);
+ Assert.AreEqual("1", function.GetArgument(0).AsString);
+
+ process.Continue(); // Go to the SubFunction
+ WaitForPause(PausedReason.Break, null);
+ Assert.AreEqual("SubFunction", process.SelectedFunction.Name);
+ Assert.AreEqual(false, function.HasExpired);
+ Assert.AreEqual("1", function.GetArgument(0).AsString);
+
+ process.Continue(); // Go back to Function
+ WaitForPause(PausedReason.Break, null);
+ Assert.AreEqual("Function", process.SelectedFunction.Name);
+ Assert.AreEqual(false, function.HasExpired);
+ Assert.AreEqual("1", function.GetArgument(0).AsString);
+
+ process.Continue(); // Setp out of function
+ WaitForPause(PausedReason.Break, null);
+ Assert.AreEqual("Main", process.SelectedFunction.Name);
+ Assert.AreEqual(true, function.HasExpired);
+
+ process.Continue();
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void FunctionVariablesLifetime()
+ {
+ Function function = null;
+ NamedValue argument = null;
+ NamedValue local = null;
+ NamedValue localInSubFunction = null;
+ NamedValue @class = null;
+
+ StartProgram("FunctionVariablesLifetime"); // 1 - Enter program
+ WaitForPause(PausedReason.Break, null);
+ function = process.SelectedFunction;
+ Assert.IsNotNull(function);
+ Assert.AreEqual("Function", function.Name);
+ argument = function.GetArgument(0);
+ local = function.LocalVariables["local"];
+ @class = function.ContaingClassVariables["class"];
+ Assert.IsNotNull(argument);
+ Assert.IsNotNull(local);
+ Assert.IsNotNull(@class);
+ Assert.AreEqual("argument", argument.Name);
+ Assert.AreEqual("local", local.Name);
+ Assert.AreEqual("class", @class.Name);
+ Assert.AreEqual("1", argument.AsString);
+ Assert.AreEqual("2", local.AsString);
+ Assert.AreEqual("3", @class.AsString);
+
+ process.Continue(); // 2 - Go to the SubFunction
+ WaitForPause(PausedReason.Break, null);
+ Assert.AreEqual("1", argument.AsString);
+ Assert.AreEqual("2", local.AsString);
+ Assert.AreEqual("3", @class.AsString);
+ // Check localInSubFunction variable
+ localInSubFunction = process.SelectedFunction.LocalVariables["localInSubFunction"];
+ Assert.AreEqual("4", localInSubFunction.AsString);
+
+ process.Continue(); // 3 - Go back to Function
+ WaitForPause(PausedReason.Break, null);
+ Assert.AreEqual("1", argument.AsString);
+ Assert.AreEqual("2", local.AsString);
+ Assert.AreEqual("3", @class.AsString);
+ // localInSubFunction should be dead now
+ Assert.IsTrue(localInSubFunction.HasExpired);
+
+ process.Continue(); // 4 - Go to the SubFunction
+ WaitForPause(PausedReason.Break, null);
+ Assert.AreEqual("1", argument.AsString);
+ Assert.AreEqual("2", local.AsString);
+ Assert.AreEqual("3", @class.AsString);
+ // localInSubFunction should be still dead...
+ Assert.IsTrue(localInSubFunction.HasExpired);
+ // ... , but we should able to get new one
+ localInSubFunction = process.SelectedFunction.LocalVariables["localInSubFunction"];
+ Assert.AreEqual("4", localInSubFunction.AsString);
+
+ process.Continue(); // 5 - Setp out of both functions
+ WaitForPause(PausedReason.Break, null);
+ Assert.IsTrue(argument.HasExpired);
+ Assert.IsTrue(local.HasExpired);
+ Assert.IsTrue(@class.HasExpired);
+
+ process.Continue();
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void ArrayValue()
+ {
+ StartProgram("ArrayValue");
+ WaitForPause(PausedReason.Break, null);
+ NamedValue array = process.SelectedFunction.LocalVariables["array"];
+ Assert.AreEqual("array", array.Name);
+ Assert.IsTrue(array.IsArray);
+ Assert.AreEqual("{System.Int32[5]}", array.AsString);
+ NamedValueCollection elements = array.GetArrayElements();
+ Assert.AreEqual(5, elements.Count);
+ for(int i = 0; i < 5; i++) {
+ Assert.AreEqual("[" + i.ToString() + "]", elements[i].Name);
+ Assert.AreEqual(i.ToString(), elements[i].AsString);
+ }
+
+ process.Continue();
+ process.WaitForExit();
+ }
+
+ [Test]
+ public void ObjectValue()
+ {
+ NamedValue local = null;
+
+ StartProgram("ObjectValue");
+ WaitForPause(PausedReason.Break, null);
+ local = process.SelectedFunction.LocalVariables["val"];
+ Assert.AreEqual("val", local.Name);
+ Assert.IsTrue(local.IsObject);
+ Assert.AreEqual("{Debugger.Tests.TestPrograms.ObjectValue}", local.AsString);
+ Assert.AreEqual("Debugger.Tests.TestPrograms.ObjectValue", local.Type.Name);
+ NamedValueCollection subVars = local.GetMembers(null, Debugger.BindingFlags.All);
+ Assert.IsTrue(subVars["privateField"].IsPrimitive);
+ Assert.IsTrue(subVars["publicFiled"].IsPrimitive);
+ Assert.IsTrue(subVars["PublicProperty"].IsPrimitive);
+ Assert.IsTrue(((MemberValue)subVars["privateField"]).MemberInfo.IsPrivate);
+ Assert.IsTrue(((MemberValue)subVars["publicFiled"]).MemberInfo.IsPublic);
+ Assert.IsTrue(((MemberValue)subVars["PublicProperty"]).MemberInfo.IsPublic);
+ DebugType baseClass = local.Type.BaseType;
+ Assert.AreEqual("Debugger.Tests.TestPrograms.BaseClass", baseClass.Name);
+ Assert.AreEqual("private", subVars["privateField"].AsString);
+
+ process.Continue();
+ WaitForPause(PausedReason.Break, null);
+ Assert.AreEqual("new private", subVars["privateField"].AsString);
+
+ process.Continue();
+ process.WaitForExit();
+ }
+
+ /*
+ [Test]
+ public void PropertyVariable()
+ {
+ StartProgram("PropertyVariable");
+ WaitForPause(PausedReason.Break, null);
+ NamedValueCollection props = process.SelectedFunction.LocalVariables["var"].GetMembers(null, Debugger.BindingFlags.All);
+
+ Assert.AreEqual(typeof(UnavailableValue), props["PrivateProperty"].Value.GetType());
+ process.StartEvaluation();
+ WaitForPause(PausedReason.EvalComplete, null);
+ Assert.AreEqual("private", props["PrivateProperty"].AsString);
+
+ Assert.AreEqual(typeof(UnavailableValue), props["PublicProperty"].Value.GetType());
+ process.StartEvaluation();
+ WaitForPause(PausedReason.EvalComplete, null);
+ Assert.AreEqual("public", props["PublicProperty"].AsString);
+
+ Assert.AreEqual(typeof(UnavailableValue), props["ExceptionProperty"].Value.GetType());
+ process.StartEvaluation();
+ WaitForPause(PausedReason.EvalComplete, null);
+ Assert.AreEqual(typeof(UnavailableValue), props["ExceptionProperty"].Value.GetType());
+
+ Assert.AreEqual(typeof(UnavailableValue), props["StaticProperty"].Value.GetType());
+ process.StartEvaluation();
+ WaitForPause(PausedReason.EvalComplete, null);
+ Assert.AreEqual("static", props["StaticProperty"].AsString);
+
+ process.Continue();
+ WaitForPause(PausedReason.Break, null);
+
+ process.Continue();
+ process.WaitForPrecessExit();
+ }
+ */
+
+ /*
+ [Test]
+ public void PropertyVariableForm()
+ {
+ Variable local = null;
+
+ StartProgram("PropertyVariableForm");
+ WaitForPause(PausedReason.Break, null);
+ foreach(Variable var in process.SelectedFunction.LocalVariables) {
+ local = var;
+ }
+ Assert.AreEqual("form", local.Name);
+ Assert.AreEqual(typeof(Variable), local.GetType());
+
+ foreach(Variable var in local.Value.SubVariables) {
+ Assert.AreEqual(typeof(UnavailableValue), var.Value.GetType(), "Variable name: " + var.Name);
+ process.StartEvaluation();
+ WaitForPause(PausedReason.EvalComplete, null);
+ Assert.AreNotEqual(null, var.Value.AsString, "Variable name: " + var.Name);
+ }
+
+ process.Continue();
+ WaitForPause(PausedReason.Break, null);
+
+ foreach(Variable var in local.Value.SubVariables) {
+ Assert.AreEqual(typeof(UnavailableValue), var.Value.GetType(), "Variable name: " + var.Name);
+ }
+ process.StartEvaluation();
+ WaitForPause(PausedReason.EvalComplete, null);
+
+ process.Continue();
+ process.WaitForPrecessExit();
+ }
+ */
+
+ [Test]
+ public void SetIP()
+ {
+ StartProgram("SetIP");
+ WaitForPause(PausedReason.Break, "1");
+
+ Assert.IsNotNull(process.SelectedFunction.CanSetIP("SetIP.cs", 16, 0));
+ Assert.IsNull(process.SelectedFunction.CanSetIP("SetIP.cs", 100, 0));
+ process.SelectedFunction.SetIP("SetIP.cs", 16, 0);
+ process.Continue();
+ WaitForPause(PausedReason.Break, "1");
+ Assert.AreEqual("1\r\n1\r\n", log);
+
+ process.Continue();
+ process.WaitForExit();
+ }
}
}