Skip to content

Commit

Permalink
Merge branch 'next' into next
Browse files Browse the repository at this point in the history
  • Loading branch information
retailcoder committed Mar 23, 2017
2 parents 315db7b + c49e48b commit 7f1e079
Show file tree
Hide file tree
Showing 29 changed files with 847 additions and 55 deletions.
31 changes: 21 additions & 10 deletions RetailCoder.VBE/Rubberduck.csproj
Expand Up @@ -500,20 +500,31 @@
</Compile>
<Compile Include="UI\Refactorings\ReorderParameters\ReorderParametersViewModel.cs" />
<Compile Include="UI\SelectionChangeService.cs" />
<Compile Include="UnitTesting\Fakes\FakeBase.cs" />
<Compile Include="UnitTesting\Fakes\FakesProvider.cs" />
<Compile Include="UnitTesting\Fakes\FakesProviderFactory.cs" />
<Compile Include="UnitTesting\Fakes\IFake.cs" />
<Compile Include="UnitTesting\Fakes\IFakesProvider.cs" />
<Compile Include="UnitTesting\Fakes\CurDir.cs" />
<Compile Include="UnitTesting\Fakes\DoEvents.cs" />
<Compile Include="UnitTesting\Fakes\Environ.cs" />
<Compile Include="UnitTesting\FakeBase.cs" />
<Compile Include="UnitTesting\FakesProvider.cs" />
<Compile Include="UnitTesting\FakesProviderFactory.cs" />
<Compile Include="UnitTesting\Fakes\Shell.cs" />
<Compile Include="UnitTesting\IFake.cs" />
<Compile Include="UnitTesting\IFakesProvider.cs" />
<Compile Include="UnitTesting\Fakes\InputBox.cs" />
<Compile Include="UnitTesting\Fakes\IVerify.cs" />
<Compile Include="UnitTesting\IVerify.cs" />
<Compile Include="UnitTesting\Fakes\MsgBox.cs" />
<Compile Include="UnitTesting\Fakes\ReturnTypeConverter.cs" />
<Compile Include="UnitTesting\Fakes\Verifier.cs" />
<Compile Include="UnitTesting\ReturnTypeConverter.cs" />
<Compile Include="UnitTesting\Fakes\Timer.cs" />
<Compile Include="UnitTesting\Stubs\ChDir.cs" />
<Compile Include="UnitTesting\Stubs\ChDrive.cs" />
<Compile Include="UnitTesting\Stubs\Kill.cs" />
<Compile Include="UnitTesting\Stubs\MkDir.cs" />
<Compile Include="UnitTesting\Stubs\RmDir.cs" />
<Compile Include="UnitTesting\Stubs\SendKeys.cs" />
<Compile Include="UnitTesting\Verifier.cs" />
<Compile Include="UnitTesting\PermissiveObjectComparer.cs" />
<Compile Include="UnitTesting\Stubs\Beep.cs" />
<Compile Include="UnitTesting\Stubs\IStub.cs" />
<Compile Include="UnitTesting\Stubs\StubBase.cs" />
<Compile Include="UnitTesting\IStub.cs" />
<Compile Include="UnitTesting\StubBase.cs" />
<Compile Include="VersionCheck\IVersionCheck.cs" />
<Compile Include="UI\Command\MenuItems\CommandBars\AppCommandBarBase.cs" />
<Compile Include="UI\Command\MenuItems\CommandBars\ContextSelectionLabelMenuItem.cs" />
Expand Down
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;

namespace Rubberduck.UnitTesting
Expand All @@ -8,8 +7,6 @@ internal abstract class FakeBase : StubBase, IFake
{
#region Internal

internal FakeBase(IntPtr procAddress) : base(procAddress) { }

protected struct ReturnValueInfo
{
public int Invocation { get; }
Expand Down Expand Up @@ -78,7 +75,7 @@ private bool TrySetReturnValue(bool any = false)
#region IFake

private static readonly List<ReturnValueInfo> ReturnValues = new List<ReturnValueInfo>();
public virtual void Returns(object value, int invocation = FakesProvider.rdAllInvocations)
public virtual void Returns(object value, int invocation = FakesProvider.AllInvocations)
{
ReturnValues.Add(new ReturnValueInfo(invocation, string.Empty, string.Empty, value));
}
Expand Down
56 changes: 56 additions & 0 deletions RetailCoder.VBE/UnitTesting/Fakes/CurDir.cs
@@ -0,0 +1,56 @@
using System;
using System.Runtime.InteropServices;
using Rubberduck.UI;

namespace Rubberduck.UnitTesting
{
// TODO: This is currently broken. The runtime throws a "bad dll calling convention error when it returns", which leads me to
// believe that it is trying to cast the return value and it isn't marshalling correctly.
internal class CurDir : FakeBase
{
private static readonly IntPtr ProcessAddressString = EasyHook.LocalHook.GetProcAddress(TargetLibrary, "rtcCurrentDir");
private static readonly IntPtr ProcessAddressVariant = EasyHook.LocalHook.GetProcAddress(TargetLibrary, "rtcCurrentDirBstr");

public CurDir()
{
InjectDelegate(new CurDirStringDelegate(CurDirStringCallback), ProcessAddressString);
InjectDelegate(new CurDirVariantDelegate(CurDirStringCallback), ProcessAddressVariant);
}

public override bool PassThrough
{
get { return false; }
// ReSharper disable once ValueParameterNotUsed
set
{
Verifier.SuppressAsserts();
AssertHandler.OnAssertInconclusive(string.Format(RubberduckUI.Assert_InvalidFakePassThrough, "CurDir"));
}
}

[UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = true)]
private delegate string CurDirStringDelegate(IntPtr drive);

public string CurDirStringCallback(IntPtr drive)
{
TrackInvocation(drive);
return ReturnValue?.ToString() ?? string.Empty;
}

[UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = true)]
private delegate string CurDirVariantDelegate(IntPtr drive);

public object CurDirVariantCallback(IntPtr drive)
{
TrackInvocation(drive);
return ReturnValue?.ToString() ?? string.Empty;
}

private void TrackInvocation(IntPtr drive)
{
OnCallBack();

TrackUsage("drive", drive);
}
}
}
43 changes: 43 additions & 0 deletions RetailCoder.VBE/UnitTesting/Fakes/DoEvents.cs
@@ -0,0 +1,43 @@
using System;
using System.Runtime.InteropServices;

namespace Rubberduck.UnitTesting
{
internal class DoEvents : FakeBase
{
private static readonly IntPtr ProcessAddress = EasyHook.LocalHook.GetProcAddress(TargetLibrary, "rtcDoEvents");

public DoEvents()
{
InjectDelegate(new DoEventsDelegate(DoEventsCallback), ProcessAddress);
}

private readonly ValueTypeConverter<int> _converter = new ValueTypeConverter<int>();
public override void Returns(object value, int invocation = FakesProvider.AllInvocations)
{
_converter.Value = value;
base.Returns((int)_converter.Value, invocation);
}

[DllImport(TargetLibrary, SetLastError = true)]
[return: MarshalAs(UnmanagedType.I4)]
private static extern int rtcDoEvents();

[UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = true)]
[return: MarshalAs(UnmanagedType.I4)]
private delegate int DoEventsDelegate();

public int DoEventsCallback()
{
OnCallBack(true);

if (PassThrough)
{
return rtcDoEvents();
}
return (int)(ReturnValue ?? 0);
}
}


}
56 changes: 56 additions & 0 deletions RetailCoder.VBE/UnitTesting/Fakes/Environ.cs
@@ -0,0 +1,56 @@
using System;
using System.Runtime.InteropServices;
using Rubberduck.UI;

namespace Rubberduck.UnitTesting
{
internal class Environ : FakeBase
{
private static readonly IntPtr ProcessAddressString = EasyHook.LocalHook.GetProcAddress(TargetLibrary, "rtcEnvironBstr");
private static readonly IntPtr ProcessAddressVariant = EasyHook.LocalHook.GetProcAddress(TargetLibrary, "rtcEnvironVar");

public Environ()
{
InjectDelegate(new EnvironStringDelegate(EnvironStringCallback), ProcessAddressString);
InjectDelegate(new EnvironVariantDelegate(EnvironStringCallback), ProcessAddressVariant);
}

public override bool PassThrough
{
get { return false; }
// ReSharper disable once ValueParameterNotUsed
set
{
Verifier.SuppressAsserts();
AssertHandler.OnAssertInconclusive(string.Format(RubberduckUI.Assert_InvalidFakePassThrough, "Environ"));
}
}

[UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = true)]
[return: MarshalAs(UnmanagedType.BStr)]
private delegate string EnvironStringDelegate(IntPtr envstring, IntPtr number);

public string EnvironStringCallback(IntPtr envstring, IntPtr number)
{
TrackInvocation(envstring, number);
return ReturnValue?.ToString() ?? string.Empty;
}

[UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = true)]
private delegate string EnvironVariantDelegate(IntPtr envstring, IntPtr number);

public object EnvironVariantCallback(IntPtr envstring, IntPtr number)
{
TrackInvocation(envstring, number);
return ReturnValue?.ToString() ?? string.Empty;
}

private void TrackInvocation(IntPtr envstring, IntPtr number)
{
OnCallBack();

TrackUsage("envstring", envstring);
TrackUsage("number", number);
}
}
}
18 changes: 0 additions & 18 deletions RetailCoder.VBE/UnitTesting/Fakes/IFakesProvider.cs

This file was deleted.

4 changes: 2 additions & 2 deletions RetailCoder.VBE/UnitTesting/Fakes/InputBox.cs
Expand Up @@ -8,9 +8,9 @@ internal class InputBox : FakeBase
{
private static readonly IntPtr ProcessAddress = EasyHook.LocalHook.GetProcAddress(TargetLibrary, "rtcInputBox");

public InputBox() : base (ProcessAddress)
public InputBox()
{
InjectDelegate(new InputBoxDelegate(InputBoxCallback));
InjectDelegate(new InputBoxDelegate(InputBoxCallback), ProcessAddress);
}

public override bool PassThrough
Expand Down
4 changes: 2 additions & 2 deletions RetailCoder.VBE/UnitTesting/Fakes/MsgBox.cs
Expand Up @@ -9,9 +9,9 @@ internal class MsgBox : FakeBase
{
private static readonly IntPtr ProcessAddress = EasyHook.LocalHook.GetProcAddress(TargetLibrary, "rtcMsgBox");

public MsgBox() : base (ProcessAddress)
public MsgBox()
{
InjectDelegate(new MessageBoxDelegate(MsgBoxCallback));
InjectDelegate(new MessageBoxDelegate(MsgBoxCallback), ProcessAddress);
}

public override bool PassThrough
Expand Down
47 changes: 47 additions & 0 deletions RetailCoder.VBE/UnitTesting/Fakes/Shell.cs
@@ -0,0 +1,47 @@
using System;
using System.Runtime.InteropServices;
using Rubberduck.Parsing.ComReflection;
using Rubberduck.Parsing.Grammar;

namespace Rubberduck.UnitTesting
{
internal class Shell : FakeBase
{
private static readonly IntPtr ProcessAddress = EasyHook.LocalHook.GetProcAddress(TargetLibrary, "rtcShell");

public Shell()
{
InjectDelegate(new ShellDelegate(ShellCallback), ProcessAddress);
}

private readonly ValueTypeConverter<double> _converter = new ValueTypeConverter<double>();
public override void Returns(object value, int invocation = FakesProvider.AllInvocations)
{
_converter.Value = value;
base.Returns((double)_converter.Value, invocation);
}

[DllImport(TargetLibrary, SetLastError = true)]
private static extern double rtcShell(IntPtr pathname, short windowstyle);

[UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = true)]
[return: MarshalAs(UnmanagedType.R8)]
private delegate double ShellDelegate(IntPtr pathname, short windowstyle);

public double ShellCallback(IntPtr pathname, short windowstyle)
{
OnCallBack(true);

var path = Marshal.PtrToStringBSTR(pathname);

TrackUsage("pathname", pathname);
TrackUsage("windowstyle", windowstyle, Tokens.Integer);

if (PassThrough)
{
return Convert.ToDouble(rtcShell(pathname, windowstyle));
}
return Convert.ToDouble(ReturnValue ?? 0);
}
}
}
41 changes: 41 additions & 0 deletions RetailCoder.VBE/UnitTesting/Fakes/Timer.cs
@@ -0,0 +1,41 @@
using System;
using System.Runtime.InteropServices;

namespace Rubberduck.UnitTesting
{
internal class Timer : FakeBase
{
private static readonly IntPtr ProcessAddress = EasyHook.LocalHook.GetProcAddress(TargetLibrary, "rtcGetTimer");

public Timer()
{
InjectDelegate(new TimerDelegate(TimerCallback), ProcessAddress);
}

private readonly ValueTypeConverter<float> _converter = new ValueTypeConverter<float>();
public override void Returns(object value, int invocation = FakesProvider.AllInvocations)
{
_converter.Value = value;
base.Returns((float)_converter.Value, invocation);
}

[DllImport(TargetLibrary, SetLastError = true)]
[return: MarshalAs(UnmanagedType.R4)]
private static extern float rtcGetTimer();

[UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = true)]
[return: MarshalAs(UnmanagedType.R4)]
private delegate float TimerDelegate();

public float TimerCallback()
{
OnCallBack(true);

if (PassThrough)
{
return rtcGetTimer();
}
return Convert.ToSingle(ReturnValue ?? 0);
}
}
}
Expand Up @@ -54,6 +54,18 @@ internal void StopTest()
public IFake MsgBox => RetrieveOrCreateFunction<IFake>(typeof(MsgBox));
public IFake InputBox => RetrieveOrCreateFunction<IFake>(typeof(InputBox));
public IStub Beep => RetrieveOrCreateFunction<IStub>(typeof(Beep));
public IFake Environ => RetrieveOrCreateFunction<IFake>(typeof(Environ));
public IFake Timer => RetrieveOrCreateFunction<IFake>(typeof(Timer));
public IFake DoEvents => RetrieveOrCreateFunction<IFake>(typeof(DoEvents));
public IFake Shell => RetrieveOrCreateFunction<IFake>(typeof(Shell));
public IStub SendKeys => RetrieveOrCreateFunction<IStub>(typeof(SendKeys));
public IStub Kill => RetrieveOrCreateFunction<IStub>(typeof(Kill));
public IStub MkDir => RetrieveOrCreateFunction<IStub>(typeof(MkDir));
public IStub RmDir => RetrieveOrCreateFunction<IStub>(typeof(RmDir));
public IStub ChDir => RetrieveOrCreateFunction<IStub>(typeof(ChDir));
public IStub ChDrive => RetrieveOrCreateFunction<IStub>(typeof(ChDrive));
//public IFake CurDir => RetrieveOrCreateFunction<IFake>(typeof(CurDir));


#endregion
}
Expand Down
File renamed without changes.

0 comments on commit 7f1e079

Please sign in to comment.