public void CanSetNextStatementFalse() { const ulong ADDRESS = 0xdeadbeef; const string NAME = "test"; const ulong ANOTHER_ADDRESS = 0xabcd; const string ANOTHER_NAME = "test1"; var threadId = 1u; var mockThread = Substitute.For <RemoteThread>(); mockThread.GetThreadId().Returns(threadId); var mockStackFrame = Substitute.For <IDebugStackFrame2>(); string name; mockStackFrame.GetName(out name).Returns(x => { x[0] = NAME; return(VSConstants.S_OK); }); IDebugThread2 outThread; IDebugThread thread = CreateDebugThread <IDebugThread>(mockThread); mockStackFrame.GetThread(out outThread).Returns(x => { x[0] = thread; return(VSConstants.S_OK); }); var mockCodeContext = Substitute.For <IDebugCodeContext2>(); var contextInfoFields = enum_CONTEXT_INFO_FIELDS.CIF_ADDRESS | enum_CONTEXT_INFO_FIELDS.CIF_FUNCTION; System.Action <CONTEXT_INFO[]> setContextInfo = infos => { infos[0].bstrFunction = ANOTHER_NAME; infos[0].bstrAddress = "0x" + ANOTHER_ADDRESS.ToString("x16"); infos[0].dwFields = contextInfoFields; }; mockCodeContext .GetInfo(contextInfoFields, Arg.Do(setContextInfo)) .Returns(VSConstants.S_OK); ((IDebugMemoryContext2)mockCodeContext) .GetInfo(Arg.Any <enum_CONTEXT_INFO_FIELDS>(), Arg.Do(setContextInfo)) .Returns(VSConstants.S_OK); var mockFrame = Substitute.For <RemoteFrame>(); mockFrame.GetPC().Returns(ADDRESS); mockThread.GetFrameAtIndex(0).Returns(mockFrame); Assert.AreEqual(VSConstants.S_FALSE, thread.CanSetNextStatement(mockStackFrame, mockCodeContext)); }
public void CanSetNextStatementDifferentThread() { var threadId = 1u; var mockThread = Substitute.For <RemoteThread>(); mockThread.GetThreadId().Returns(threadId); var mockStackFrame = Substitute.For <IDebugStackFrame2>(); IDebugThread2 outThread; IDebugThread thread = CreateDebugThread <IDebugThread>(mockThread); mockStackFrame.GetThread(out outThread).Returns(x => { x[0] = Substitute.For <IDebugThread2>(); return(VSConstants.S_OK); }); var mockCodeContext = Substitute.For <IDebugCodeContext2>(); Assert.AreEqual(VSConstants.S_FALSE, thread.CanSetNextStatement(mockStackFrame, mockCodeContext)); }
public void CanSetNextStatementMatchingPc() { const ulong ADDRESS = 0xdeadbeef; const string NAME = "test"; var threadId = 1u; var mockThread = Substitute.For <RemoteThread>(); mockThread.GetThreadId().Returns(threadId); var mockStackFrame = Substitute.For <IDebugStackFrame2>(); string name; mockStackFrame.GetName(out name).Returns(x => { x[0] = NAME; return(VSConstants.S_OK); }); IDebugThread2 outThread; IDebugThread thread = CreateDebugThread <IDebugThread>(mockThread); mockStackFrame.GetThread(out outThread).Returns(x => { x[0] = thread; return(VSConstants.S_OK); }); var mockCodeContext = Substitute.For <IDebugCodeContext2>(); mockCodeContext .GetInfo(enum_CONTEXT_INFO_FIELDS.CIF_ADDRESS | enum_CONTEXT_INFO_FIELDS.CIF_FUNCTION, Arg.Do <CONTEXT_INFO[]>(infos => { infos[0].bstrAddress = "0x" + ADDRESS.ToString("x16"); infos[0].bstrFunction = NAME; })) .Returns(VSConstants.S_OK); var mockFrame = Substitute.For <RemoteFrame>(); mockFrame.GetPC().Returns(ADDRESS); mockThread.GetFrameAtIndex(0).Returns(mockFrame); Assert.AreEqual(VSConstants.S_OK, thread.CanSetNextStatement(mockStackFrame, mockCodeContext)); }
public void CanSetNextStatementSameFunction() { const string NAME = "test"; var threadId = 1u; var mockThread = Substitute.For <RemoteThread>(); mockThread.GetThreadId().Returns(threadId); var mockStackFrame = Substitute.For <IDebugStackFrame2>(); string name; mockStackFrame.GetName(out name).Returns(x => { x[0] = NAME; return(VSConstants.S_OK); }); IDebugThread2 outThread; IDebugThread thread = CreateDebugThread <IDebugThread>(mockThread); mockStackFrame.GetThread(out outThread).Returns(x => { x[0] = thread; return(VSConstants.S_OK); }); var mockCodeContext = Substitute.For <IDebugCodeContext2>(); var contextInfosDestination = Arg.Any <CONTEXT_INFO[]>(); mockCodeContext.GetInfo(enum_CONTEXT_INFO_FIELDS.CIF_ADDRESS | enum_CONTEXT_INFO_FIELDS.CIF_FUNCTION, contextInfosDestination).Returns(x => { var infos = x[1] as CONTEXT_INFO[]; infos[0] = new CONTEXT_INFO { bstrFunction = NAME, bstrAddress = "0xabcd", }; return(VSConstants.S_OK); }); Assert.AreEqual(VSConstants.S_OK, thread.CanSetNextStatement(mockStackFrame, mockCodeContext)); }