diff --git a/AstroMath.UnitTests/AstroMath.UnitTests.csproj b/AstroMath.UnitTests/AstroMath.UnitTests.csproj
index ecf9b7d..9f778de 100644
--- a/AstroMath.UnitTests/AstroMath.UnitTests.csproj
+++ b/AstroMath.UnitTests/AstroMath.UnitTests.csproj
@@ -56,8 +56,8 @@
..\packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll
-
- ..\packages\Moq.4.12.0\lib\net45\Moq.dll
+
+ ..\packages\Moq.4.13.0\lib\net45\Moq.dll
..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll
@@ -65,8 +65,8 @@
-
- ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
+
+ ..\packages\System.Runtime.CompilerServices.Unsafe.4.6.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll
diff --git a/AstroMath.UnitTests/app.config b/AstroMath.UnitTests/app.config
index 8d5ec5f..319783c 100644
--- a/AstroMath.UnitTests/app.config
+++ b/AstroMath.UnitTests/app.config
@@ -6,6 +6,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/AstroMath.UnitTests/packages.config b/AstroMath.UnitTests/packages.config
index b50b126..2b99214 100644
--- a/AstroMath.UnitTests/packages.config
+++ b/AstroMath.UnitTests/packages.config
@@ -1,8 +1,8 @@
-
+
-
+
\ No newline at end of file
diff --git a/Meade.net.Focuser.UnitTests/Meade.net.Focuser.UnitTests.csproj b/Meade.net.Focuser.UnitTests/Meade.net.Focuser.UnitTests.csproj
index fb2522e..be4f91f 100644
--- a/Meade.net.Focuser.UnitTests/Meade.net.Focuser.UnitTests.csproj
+++ b/Meade.net.Focuser.UnitTests/Meade.net.Focuser.UnitTests.csproj
@@ -71,8 +71,8 @@
..\packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll
-
- ..\packages\Moq.4.12.0\lib\net45\Moq.dll
+
+ ..\packages\Moq.4.13.0\lib\net45\Moq.dll
..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll
@@ -80,8 +80,8 @@
-
- ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
+
+ ..\packages\System.Runtime.CompilerServices.Unsafe.4.6.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll
diff --git a/Meade.net.Focuser.UnitTests/app.config b/Meade.net.Focuser.UnitTests/app.config
index 8d5ec5f..319783c 100644
--- a/Meade.net.Focuser.UnitTests/app.config
+++ b/Meade.net.Focuser.UnitTests/app.config
@@ -6,6 +6,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/Meade.net.Focuser.UnitTests/packages.config b/Meade.net.Focuser.UnitTests/packages.config
index 1330573..cad1be5 100644
--- a/Meade.net.Focuser.UnitTests/packages.config
+++ b/Meade.net.Focuser.UnitTests/packages.config
@@ -2,8 +2,8 @@
-
+
-
+
\ No newline at end of file
diff --git a/Meade.net.Telescope.UnitTests/Meade.net.Telescope.UnitTests.csproj b/Meade.net.Telescope.UnitTests/Meade.net.Telescope.UnitTests.csproj
index 9fcbe99..9484bd1 100644
--- a/Meade.net.Telescope.UnitTests/Meade.net.Telescope.UnitTests.csproj
+++ b/Meade.net.Telescope.UnitTests/Meade.net.Telescope.UnitTests.csproj
@@ -92,8 +92,8 @@
..\packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll
-
- ..\packages\Moq.4.12.0\lib\net45\Moq.dll
+
+ ..\packages\Moq.4.13.0\lib\net45\Moq.dll
..\packages\NUnit.3.12.0\lib\net40\nunit.framework.dll
@@ -101,8 +101,8 @@
-
- ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll
+
+ ..\packages\System.Runtime.CompilerServices.Unsafe.4.6.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll
diff --git a/Meade.net.Telescope.UnitTests/app.config b/Meade.net.Telescope.UnitTests/app.config
index ea6ff10..487342b 100644
--- a/Meade.net.Telescope.UnitTests/app.config
+++ b/Meade.net.Telescope.UnitTests/app.config
@@ -4,7 +4,7 @@
-
+
diff --git a/Meade.net.Telescope.UnitTests/packages.config b/Meade.net.Telescope.UnitTests/packages.config
index 4c380c0..688d530 100644
--- a/Meade.net.Telescope.UnitTests/packages.config
+++ b/Meade.net.Telescope.UnitTests/packages.config
@@ -2,8 +2,8 @@
-
+
-
+
\ No newline at end of file
diff --git a/Meade.net.UnitTests/BootstrapAscomProfileStore.ps1 b/Meade.net.UnitTests/BootstrapAscomProfileStore.ps1
new file mode 100644
index 0000000..213c64d
--- /dev/null
+++ b/Meade.net.UnitTests/BootstrapAscomProfileStore.ps1
@@ -0,0 +1,36 @@
+<#
+This script initializes a bare minimum set of registry entries required for ASCOM.Utilities.Profile to work
+without throwing any exceptions. When building on a build server, or on a computer without the ASCOM Platform installed,
+it may be useful to execute this script as a build step prior to running any unit tests, or calling any code that relies on
+ASCOM.Utilities.Profile. The alternative is to install the ASCOM Platform on the build agent.
+
+NOTE: This script equires elevated permissions because it creates registry keys in the LocalMachine hive.
+#>
+
+$wow = Test-Path HKLM:\SOFTWARE\Wow6432Node
+if ($wow)
+ {
+ $root = "HKLM:\SOFTWARE\Wow6432Node"
+ }
+else
+ {
+ $root = "HKLM:\SOFTWARE"
+ }
+$ascomRoot = $root + "\ASCOM"
+
+if (Test-Path $ascomRoot)
+ {
+ <# Don't upset an already-existing ASCOM registry #>
+ exit
+ }
+
+<# Create the ASCOM root key and set it's ACL to allow all users read/write access #>
+New-Item -Path $root -Name ASCOM –Force
+$ascomAcl = Get-Acl $ascomRoot
+$aclRule = New-Object System.Security.AccessControl.RegistryAccessRule ("Users","FullControl","Allow")
+$ascomAcl.SetAccessRule($aclRule)
+$ascomAcl | Set-Acl -Path $ascomRoot
+
+<# Now create the bare minimum keys required so that ASCOM.Utilities.Profile doesn't crash and burn #>
+New-ItemProperty -Path $ascomRoot -Name PlatformVersion -Value "6.1" -PropertyType String –Force
+New-ItemProperty -Path $ascomRoot -Name SerTraceFile -Value "C:\SerialTraceAuto.txt" -PropertyType String –Force
diff --git a/Meade.net.UnitTests/Meade.net.UnitTests.csproj b/Meade.net.UnitTests/Meade.net.UnitTests.csproj
new file mode 100644
index 0000000..1889ad4
--- /dev/null
+++ b/Meade.net.UnitTests/Meade.net.UnitTests.csproj
@@ -0,0 +1,117 @@
+
+
+
+
+
+ Debug
+ AnyCPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}
+ Library
+ Properties
+ Meade.net.UnitTests
+ Meade.net.UnitTests
+ v4.7.2
+ 512
+ true
+
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Astrometry.dll
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Attributes.dll
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Cache.dll
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Controls.dll
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.DeviceInterfaces.dll
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.DriverAccess.dll
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Exceptions.dll
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Internal.Extensions.dll
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.SettingsProvider.dll
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Utilities.dll
+
+
+ ..\packages\ASCOM.Platform.6.4.2\lib\net40\ASCOM.Utilities.Video.dll
+
+
+ ..\packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll
+
+
+ ..\packages\Moq.4.13.0\lib\net45\Moq.dll
+
+
+ ..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll
+
+
+
+
+
+ ..\packages\System.Runtime.CompilerServices.Unsafe.4.6.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
+
+
+ ..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {3689a2cb-94c5-4012-a5cf-7e7d1dd27143}
+ Meade.net
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
\ No newline at end of file
diff --git a/Meade.net.UnitTests/Properties/AssemblyInfo.cs b/Meade.net.UnitTests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..104173b
--- /dev/null
+++ b/Meade.net.UnitTests/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Meade.net.UnitTests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Meade.net.UnitTests")]
+[assembly: AssemblyCopyright("Copyright © 2019")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("21ef28b4-d574-4a2d-a61d-5df96af46ab2")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Meade.net.UnitTests/SharedResourcesUnitTests.cs b/Meade.net.UnitTests/SharedResourcesUnitTests.cs
new file mode 100644
index 0000000..05890d2
--- /dev/null
+++ b/Meade.net.UnitTests/SharedResourcesUnitTests.cs
@@ -0,0 +1,94 @@
+
+using ASCOM.Meade.net;
+using ASCOM.Utilities.Interfaces;
+using Moq;
+using NUnit.Framework;
+
+namespace Meade.net.UnitTests
+{
+ [TestFixture]
+ public class SharedResourcesUnitTests
+ {
+ private Mock _serialMock;
+
+ [SetUp]
+ public void Setup()
+ {
+ _serialMock = new Mock();
+
+ SharedResources.SharedSerial = _serialMock.Object;
+ }
+
+ [Test]
+ public void CheckThatSerialPortIsSetToUseMock()
+ {
+ Assert.That(SharedResources.SharedSerial,Is.EqualTo(_serialMock.Object));
+ }
+
+ [Test]
+ public void SendBlind_WhenCalled_Then_ClearsBuffersAndSendsMessage()
+ {
+ var expectedMessage = "Test";
+
+ SharedResources.SendBlind(expectedMessage);
+
+ _serialMock.Verify(x=> x.ClearBuffers(), Times.Once);
+ _serialMock.Verify(x=>x.Transmit(expectedMessage), Times.Once);
+ }
+
+ [Test]
+ public void SendChar_WhenCalled_ThenSendsMessageAndReadsExpectedNumberOfCharacters()
+ {
+ var expectedMessage = "Test";
+ var expectedResult = "A";
+
+ _serialMock.Setup(x => x.ReceiveCounted(1)).Returns(expectedResult);
+
+ var result = SharedResources.SendChar(expectedMessage);
+
+ _serialMock.Verify(x => x.ClearBuffers(), Times.Once);
+ _serialMock.Verify(x => x.Transmit(expectedMessage), Times.Once);
+ _serialMock.Verify(x => x.ReceiveCounted(1), Times.Once);
+ Assert.That(result, Is.EqualTo(expectedResult));
+ }
+
+ [Test]
+ public void SendString_WhenCalled_ThenSendsMessageAndReadsResultUntilTerminatorFound()
+ {
+ var expectedMessage = "Test";
+ var expectedResult = "TestMessage#";
+
+ _serialMock.Setup(x => x.ReceiveTerminated("#")).Returns(expectedResult);
+
+ var result = SharedResources.SendString(expectedMessage);
+
+ _serialMock.Verify(x => x.ClearBuffers(), Times.Once);
+ _serialMock.Verify(x => x.Transmit(expectedMessage), Times.Once);
+ _serialMock.Verify(x => x.ReceiveTerminated("#"), Times.Once);
+ Assert.That(result, Is.EqualTo(expectedResult.TrimEnd('#')));
+ }
+
+ [Test]
+ public void ReadTerminated_WhenCalled_ThenReadsResultUntilTerminatorFound()
+ {
+ var expectedResult = "TestMessage#";
+
+ _serialMock.Setup(x => x.ReceiveTerminated("#")).Returns(expectedResult);
+
+ var result = SharedResources.ReadTerminated();
+
+ _serialMock.Verify(x => x.ReceiveTerminated("#"), Times.Once);
+ Assert.That(result, Is.EqualTo(expectedResult));
+ }
+
+ [Test]
+ public void ReadCharacters_WhenCalled_ThenReadsSpecificNumberOfCharacters()
+ {
+ var numberOfCharacters = 5;
+
+ SharedResources.ReadCharacters(numberOfCharacters);
+
+ _serialMock.Verify(x => x.ReceiveCounted(numberOfCharacters), Times.Once);
+ }
+ }
+}
diff --git a/Meade.net.UnitTests/app.config b/Meade.net.UnitTests/app.config
new file mode 100644
index 0000000..319783c
--- /dev/null
+++ b/Meade.net.UnitTests/app.config
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Meade.net.UnitTests/packages.config b/Meade.net.UnitTests/packages.config
new file mode 100644
index 0000000..cad1be5
--- /dev/null
+++ b/Meade.net.UnitTests/packages.config
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Meade.net.sln b/Meade.net.sln
index 7cf5f7f..25d344c 100644
--- a/Meade.net.sln
+++ b/Meade.net.sln
@@ -25,6 +25,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meade.net.Telescope.UnitTes
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meade.net.Focuser.UnitTests", "Meade.net.Focuser.UnitTests\Meade.net.Focuser.UnitTests.csproj", "{A3991FA7-23C3-405A-96F9-5AB03AC58F30}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meade.net.UnitTests", "Meade.net.UnitTests\Meade.net.UnitTests.csproj", "{21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -137,6 +139,18 @@ Global
{A3991FA7-23C3-405A-96F9-5AB03AC58F30}.Release|x64.Build.0 = Release|Any CPU
{A3991FA7-23C3-405A-96F9-5AB03AC58F30}.Release|x86.ActiveCfg = Release|Any CPU
{A3991FA7-23C3-405A-96F9-5AB03AC58F30}.Release|x86.Build.0 = Release|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Debug|x64.Build.0 = Debug|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Debug|x86.Build.0 = Debug|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Release|x64.ActiveCfg = Release|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Release|x64.Build.0 = Release|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Release|x86.ActiveCfg = Release|Any CPU
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -147,6 +161,7 @@ Global
{AD4959DD-33D7-4C3F-8DB0-7361D8E74A95} = {0958D817-269C-44BE-BEFB-F3E6A409DE91}
{B7EEEEFD-5BFF-443D-981C-7B8AB5DFDE33} = {0958D817-269C-44BE-BEFB-F3E6A409DE91}
{A3991FA7-23C3-405A-96F9-5AB03AC58F30} = {0958D817-269C-44BE-BEFB-F3E6A409DE91}
+ {21EF28B4-D574-4A2D-A61D-5DF96AF46AB2} = {0958D817-269C-44BE-BEFB-F3E6A409DE91}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3C0509DC-C7F5-48DC-920D-DCFD9C879BD2}
diff --git a/Meade.net.v3.ncrunchsolution b/Meade.net.v3.ncrunchsolution
index e4047c2..c8975a7 100644
--- a/Meade.net.v3.ncrunchsolution
+++ b/Meade.net.v3.ncrunchsolution
@@ -2,6 +2,10 @@
True
True
+
+ FocuserTestConsole\FocuserTestConsole.csproj
+ TelescopeTestConsole\TelescopeTestConsole.csproj
+
True
\ No newline at end of file
diff --git a/Meade.net/SharedResources.cs b/Meade.net/SharedResources.cs
index 1c73926..3f2c537 100644
--- a/Meade.net/SharedResources.cs
+++ b/Meade.net/SharedResources.cs
@@ -19,6 +19,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.Windows.Forms;
using ASCOM.Utilities;
+using ASCOM.Utilities.Interfaces;
namespace ASCOM.Meade.net
{
@@ -36,7 +37,7 @@ namespace ASCOM.Meade.net
private static readonly object LockObject = new object();
// Shared serial port. This will allow multiple drivers to use one single serial port.
- private static Serial _sSharedSerial; // Shared serial port
+ private static ISerial _sSharedSerial; // Shared serial port
//
// Public access to shared resources
@@ -59,9 +60,13 @@ namespace ASCOM.Meade.net
//
///
- /// Shared serial port
+ /// Shared serial port. Do not directly access this method.
///
- private static Serial SharedSerial => _sSharedSerial ?? (_sSharedSerial = new Serial());
+ public static ISerial SharedSerial
+ {
+ get => _sSharedSerial ?? (_sSharedSerial = new Serial());
+ set => _sSharedSerial = value;
+ }
public static void SendBlind(string message)
{