diff --git a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs index 3f82e7a..e53cad0 100644 --- a/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs +++ b/Meade.net.Telescope.UnitTests/TelescopeUnitTests.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.Eventing.Reader; using ASCOM; using ASCOM.Astrometry.AstroUtils; using ASCOM.DeviceInterface; @@ -700,5 +701,302 @@ namespace Meade.net.Telescope.UnitTests Assert.That(result, Is.False); } + + [Test] + public void Declination_Get_WhenNotConnected_ThenThrowsException() + { + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497); + _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497_31EE); + + var exception = Assert.Throws(() => { var actualResult = _telescope.Declination; }); + Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: Declination Get")); + } + + [TestCase("s12*34")] + [TestCase("s12*34’56")] + public void Declination_Get_WhenConnected_ThenReadsValueFromScope(string declincationString) + { + var expectedResult = 12.34; + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497); + _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497_31EE); + _telescope.Connected = true; + + _sharedResourcesWrapperMock.Setup(x => x.SendString(":GD#")).Returns(declincationString); + _utilMock.Setup(x => x.DMSToDegrees(declincationString)).Returns(expectedResult); + + var actualResult = _telescope.Declination; + Assert.That(actualResult, Is.EqualTo(expectedResult)); + } + + [Test] + public void DeclinationRate_Get_ThenReturns0() + { + var actualResult = _telescope.DeclinationRate; + + Assert.That(actualResult, Is.EqualTo(0)); + } + + [Test] + public void DeclinationRate_Set_ThenThrowsException() + { + var excpetion = Assert.Throws(() => { _telescope.DeclinationRate = 0; }); + + Assert.That(excpetion.Property, Is.EqualTo("DeclinationRate")); + Assert.That(excpetion.AccessorSet, Is.True); + } + + [Test] + public void DestinationSideOfPier_ThenThrowsException() + { + var excpetion = Assert.Throws(() => { var result = _telescope.DestinationSideOfPier(0,0); }); + + Assert.That(excpetion.Method, Is.EqualTo("DestinationSideOfPier")); + } + + [Test] + public void DoesRefraction_Get_ThenThrowsException() + { + var excpetion = Assert.Throws(() => { var result = _telescope.DoesRefraction; }); + + Assert.That(excpetion.Property, Is.EqualTo("DoesRefraction")); + Assert.That(excpetion.AccessorSet, Is.False); + } + + [Test] + public void DoesRefraction_Set_ThenThrowsException() + { + var excpetion = Assert.Throws(() => { _telescope.DoesRefraction = true; }); + + Assert.That(excpetion.Property, Is.EqualTo("DoesRefraction")); + Assert.That(excpetion.AccessorSet, Is.True); + } + + [Test] + public void EquatorialSystem_Get_ReturnsExpectedValue() + { + var actualResult = _telescope.EquatorialSystem; + + Assert.That(actualResult, Is.EqualTo(EquatorialCoordinateType.equTopocentric)); + } + + [Test] + public void FindHome_ThenThrowsException() + { + var excpetion = Assert.Throws(() => { _telescope.FindHome();}); + + Assert.That(excpetion.Method, Is.EqualTo("FindHome")); + } + + [Test] + public void FocalLength_Get_ThenThrowsException() + { + var excpetion = Assert.Throws(() => { var result = _telescope.FocalLength; }); + + Assert.That(excpetion.Property, Is.EqualTo("FocalLength")); + Assert.That(excpetion.AccessorSet, Is.False); + } + + [Test] + public void GuideRateDeclination_Get_ThenThrowsException() + { + var excpetion = Assert.Throws(() => { var result = _telescope.GuideRateDeclination; }); + + Assert.That(excpetion.Property, Is.EqualTo("GuideRateDeclination")); + Assert.That(excpetion.AccessorSet, Is.False); + } + + [Test] + public void GuideRateDeclination_Set_ThenThrowsException() + { + var excpetion = Assert.Throws(() => { _telescope.GuideRateDeclination = 0; }); + + Assert.That(excpetion.Property, Is.EqualTo("GuideRateDeclination")); + Assert.That(excpetion.AccessorSet, Is.True); + } + + [Test] + public void GuideRateRightAscension_Get_ThenThrowsException() + { + var excpetion = Assert.Throws(() => { var result = _telescope.GuideRateRightAscension; }); + + Assert.That(excpetion.Property, Is.EqualTo("GuideRateRightAscension")); + Assert.That(excpetion.AccessorSet, Is.False); + } + + [Test] + public void GuideRateRightAscension_Set_ThenThrowsException() + { + var excpetion = Assert.Throws(() => { _telescope.GuideRateRightAscension = 0; }); + + Assert.That(excpetion.Property, Is.EqualTo("GuideRateRightAscension")); + Assert.That(excpetion.AccessorSet, Is.True); + } + + [Test] + public void IsPulseGuiding_Get_ReturnsFalse() + { + var result = _telescope.IsPulseGuiding; + + Assert.That(result, Is.False); + } + + + [Test] + public void MoveAxis_WhenNotConnected_ThenThrowsException() + { + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497); + _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497_31EE); + + var exception = Assert.Throws(() => { _telescope.MoveAxis(TelescopeAxes.axisPrimary, 0); }); + Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: MoveAxis")); + } + + [TestCase( 0, "", TelescopeAxes.axisPrimary)] + [TestCase( 1, ":RG#", TelescopeAxes.axisPrimary)] + [TestCase(-1, ":RG#", TelescopeAxes.axisPrimary)] + [TestCase( 2, ":RC#", TelescopeAxes.axisPrimary)] + [TestCase(-2, ":RC#", TelescopeAxes.axisPrimary)] + [TestCase( 3, ":RM#", TelescopeAxes.axisPrimary)] + [TestCase(-3, ":RM#", TelescopeAxes.axisPrimary)] + [TestCase( 4, ":RS#", TelescopeAxes.axisPrimary)] + [TestCase(-4, ":RS#", TelescopeAxes.axisPrimary)] + [TestCase(0, "", TelescopeAxes.axisSecondary)] + [TestCase(1, ":RG#", TelescopeAxes.axisSecondary)] + [TestCase(-1, ":RG#", TelescopeAxes.axisSecondary)] + [TestCase(2, ":RC#", TelescopeAxes.axisSecondary)] + [TestCase(-2, ":RC#", TelescopeAxes.axisSecondary)] + [TestCase(3, ":RM#", TelescopeAxes.axisSecondary)] + [TestCase(-3, ":RM#", TelescopeAxes.axisSecondary)] + [TestCase(4, ":RS#", TelescopeAxes.axisSecondary)] + [TestCase(-4, ":RS#", TelescopeAxes.axisSecondary)] + public void MoveAxis_WhenConnected_ThenExecutesCorrectCommandSequence(double rate, string slewRateCommand, TelescopeAxes axis) + { + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497); + _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497_31EE); + _telescope.Connected = true; + + _telescope.MoveAxis(axis, rate); + + if (slewRateCommand != string.Empty) + _sharedResourcesWrapperMock.Verify( x => x.SendBlind(slewRateCommand), Times.Once); + else + { + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":RG#"), Times.Never); + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":RC#"), Times.Never); + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":RM#"), Times.Never); + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":RS#"), Times.Never); + } + + switch (axis) + { + case TelescopeAxes.axisPrimary: + if (rate == 0) + { + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":Qe#"), Times.Once); + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":Qw#"), Times.Once); + } + else if (rate > 0) + { + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":Me#"), Times.Once); + } + else + { + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":Mw#"), Times.Once); + } + break; + case TelescopeAxes.axisSecondary: + if (rate == 0) + { + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":Qn#"), Times.Once); + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":Qs#"), Times.Once); + } + else if (rate > 0) + { + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":Mn#"), Times.Once); + } + else + { + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":Ms#"), Times.Once); + } + break; + default: + Assert.Fail("This should never happen"); + break; + } + } + + [Test] + public void MoveAxis_WhenRateTooHigh_ThenThrowsException() + { + var testRate = 5; + + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497); + _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497_31EE); + _telescope.Connected = true; + + var exception = Assert.Throws( () => { _telescope.MoveAxis(TelescopeAxes.axisTertiary, testRate); }); + + Assert.That(exception.Message, Is.EqualTo($"Rate {testRate} not supported")); + } + + [Test] + public void MoveAxis_WhenTertiaryAxis_ThenThrowsException() + { + var testRate = 0; + + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497); + _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497_31EE); + _telescope.Connected = true; + + var exception = Assert.Throws(() => { _telescope.MoveAxis(TelescopeAxes.axisTertiary, testRate); }); + + Assert.That(exception.Message, Is.EqualTo($"Can not move this axis.")); + } + + [Test] + public void Park_WhenNotConnected_ThenThrowsException() + { + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497); + _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497_31EE); + + var exception = Assert.Throws(() => { _telescope.Park(); }); + Assert.That(exception.Message, Is.EqualTo("Not connected to telescope when trying to execute: Park")); + } + + [Test] + public void Park_WhenNotParked_ThenSendsParkCommand() + { + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497); + _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497_31EE); + _telescope.Connected = true; + Assert.That(_telescope.AtPark, Is.False); + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":hP#"), Times.Never); + + _telescope.Park(); + + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":hP#"), Times.Once); + Assert.That(_telescope.AtPark, Is.True); + } + + [Test] + public void Park_WhenParked_ThenDoesNothing() + { + _sharedResourcesWrapperMock.Setup(x => x.ProductName).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497); + _sharedResourcesWrapperMock.Setup(x => x.FirmwareVersion).Returns(() => _sharedResourcesWrapperMock.Object.AUTOSTAR497_31EE); + _telescope.Connected = true; + + _telescope.Park(); + + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":hP#"), Times.Once); + Assert.That(_telescope.AtPark, Is.True); + + + //act + _telescope.Park(); + + //no change from previous state. + _sharedResourcesWrapperMock.Verify(x => x.SendBlind(":hP#"), Times.Once); + Assert.That(_telescope.AtPark, Is.True); + } } } diff --git a/Meade.net.Telescope/Telescope.cs b/Meade.net.Telescope/Telescope.cs index b95c53a..b5a4371 100644 --- a/Meade.net.Telescope/Telescope.cs +++ b/Meade.net.Telescope/Telescope.cs @@ -822,7 +822,7 @@ namespace ASCOM.Meade.net var result = _sharedResourcesWrapper.SendString(":GD#"); //:GD# Get Telescope Declination. - //Returns: sDD* MM# or sDD*MM’SS# + //Returns: sDD*MM# or sDD*MM’SS# //Depending upon the current precision setting for the telescope. double declination = _utilities.DMSToDegrees(result); @@ -850,7 +850,7 @@ namespace ASCOM.Meade.net public PierSide DestinationSideOfPier(double rightAscension, double declination) { LogMessage("DestinationSideOfPier Get", "Not implemented"); - throw new ASCOM.PropertyNotImplementedException("DestinationSideOfPier", false); + throw new ASCOM.MethodNotImplementedException("DestinationSideOfPier"); } public bool DoesRefraction @@ -924,6 +924,7 @@ namespace ASCOM.Meade.net { get { + //Todo implement this if I can make the new pulse guiding async LogMessage("IsPulseGuiding Get", "pulse guiding is synchronous for this driver"); //throw new ASCOM.PropertyNotImplementedException("IsPulseGuiding", false); return false; @@ -1026,7 +1027,7 @@ namespace ASCOM.Meade.net break; default: - throw new ASCOM.MethodNotImplementedException("Can not move this axis."); + throw new ASCOM.InvalidValueException("Can not move this axis."); } } @@ -1080,7 +1081,8 @@ namespace ASCOM.Meade.net //Returns – Nothing //LX200 – Not Supported - _utilities.WaitForMilliseconds(duration); //todo figure out if this is really needed + //todo implement IsPulseGuiding if WaitForMilliseconds is not needed + _utilities.WaitForMilliseconds(duration); //todo figure out if this is really needed } else {