From 0d1b123a4da1790fc8a3962b34c334c923b8a095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sun, 24 Dec 2006 00:21:56 +0000 Subject: [PATCH] Debugger tests compile (but fail) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2206 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Debugger/NDebugger.cs | 2 - .../Src/Debugger/Process-StateControl.cs | 11 +- .../Project/Src/Threads/Function.cs | 8 +- .../Src/Threads/NDebugger-Processes.cs | 5 - .../Project/Src/Threads/Process.cs | 1 + .../Variables/Values/NamedValueCollection.cs | 44 +- .../Project/Debugger.Tests.csproj | 4 - .../Project/Src/DebuggerTests.cs | 1114 ++++++++--------- 8 files changed, 588 insertions(+), 601 deletions(-) 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(); + } } }