diff --git a/Tests/WeighingTests/MockScale.cs b/Tests/WeighingTests/MockScale.cs index ad3bade..5d058b7 100644 --- a/Tests/WeighingTests/MockScale.cs +++ b/Tests/WeighingTests/MockScale.cs @@ -1,7 +1,6 @@ using System.Net.Sockets; using System.Net; using System.Text; -using System.IO; namespace Tests.WeighingTests { public abstract class MockScale : IDisposable { diff --git a/Tests/WeighingTests/ScaleHandlers.cs b/Tests/WeighingTests/ScaleHandlers.cs new file mode 100644 index 0000000..1c3d855 --- /dev/null +++ b/Tests/WeighingTests/ScaleHandlers.cs @@ -0,0 +1,104 @@ +namespace Tests.WeighingTests { + public static class ScaleHandlers { + + public static (string, bool) Handle_IT3000A(string req, int weight, string? error, int identNr) { + var modes = error?.Split(';') ?? []; + var overloaded = modes.Contains("overloaded"); + var moving = modes.Contains("moving"); + var invalid = modes.Contains("invalid"); + var crc = modes.Contains("crc"); + var unit = modes.Contains("unit"); + + Thread.Sleep(100); + + if (invalid) { + return ("abcd\r\n", false); + } else if (!req.StartsWith('<') || !req.EndsWith('>')) { + return ("<31>\r\n", false); + } + req = req[1..^1]; + + bool incr; + if (req.Length > 3) { + return ("<32>\r\n", false); + } else if (req.StartsWith("RN")) { + incr = true; + } else if (req.StartsWith("RM")) { + incr = false; + } else { + return ("<32>\r\n", false); + } + + if (overloaded) { + return ("<12>\r\n", false); + } else if (weight == 0) { + incr = false; + } + + if (moving && incr) + return ("<13>\r\n", false); + + string data = $"00{(moving ? 1 : 0)}0{new DateTime(2020, 10, 15, 12, 34, 0):dd.MM.yyHH:mm}{(incr ? identNr : 0),4}1" + + $"{weight,8}{0,8}{weight,8}{(unit ? "lb" : "kg")} {"1",3}"; + ushort checksum = Elwig.Helpers.Utils.CalcCrc16Modbus(data); + if (crc) checksum += 10; + return ($"<{data}{checksum,8}>\r\n", incr); + } + + public static (string, bool) Handle_L246(string req, int weight, string? error, int identNr) { + var modes = error?.Split(';') ?? []; + var overloaded = modes.Contains("overloaded"); + var moving = modes.Contains("moving"); + var invalid = modes.Contains("invalid"); + var crc = modes.Contains("crc"); + var unit = modes.Contains("unit"); + + Thread.Sleep(100); + + if (invalid) { + return ("abcd\r\n", false); + } else if (!req.StartsWith('<') || !req.EndsWith('>')) { + return ("<31>\r\n", false); + } + req = req[1..^1]; + + bool incr; + if (req.Length > 3) { + return ("<32>\r\n", false); + } else if (req.StartsWith("RN")) { + incr = true; + } else if (req.StartsWith("RM")) { + incr = false; + } else { + return ("<32>\r\n", false); + } + + if (overloaded) + return ("<12>\r\n", false); + + if (moving && incr) + return ("<13>\r\n", false); + + string data = $"00{(moving ? 1 : 0)}0{new DateTime(2020, 10, 17, 14, 23, 0):dd.MM.yyHH:mm}{(incr ? identNr : 0),4}1" + + $"{weight,8}{0,8}{weight,8}{(unit ? "lb" : "kg")} {"001",3}"; + ushort checksum = Elwig.Helpers.Utils.CalcCrc16Modbus(data); + if (crc) checksum += 10; + return ($"<{data}{checksum,8}>\r\n", incr); + } + + public static (string, bool) Handle_L320(int weight, string? error, int identNr) { + var modes = error?.Split(';') ?? []; + var invalid = modes.Contains("invalid"); + var unit = modes.Contains("unit"); + + Thread.Sleep(100); + + if (invalid) { + return ("abcd\r\n", false); + } + + bool incr = true; + return ($" {new DateTime(2020, 9, 28, 9, 8, 0):dd.MM.yy HH:mm} {identNr,4} {weight,9}{(unit ? "lb" : "kg")} \r\n", incr); + } + } +} diff --git a/Tests/WeighingTests/ScaleTestBadenL320.cs b/Tests/WeighingTests/ScaleTestBadenL320.cs index 1b36d49..b6fc32e 100644 --- a/Tests/WeighingTests/ScaleTestBadenL320.cs +++ b/Tests/WeighingTests/ScaleTestBadenL320.cs @@ -4,49 +4,36 @@ namespace Tests.WeighingTests { [TestFixture] public class ScaleTestBadenL320 { - private EventMockScale? Mock; - private AveryEventScale? Scale; - - private static (string, bool) ScaleHandler(int weight, string? error, int identNr) { - var modes = error?.Split(';') ?? []; - var invalid = modes.Contains("invalid"); - var unit = modes.Contains("unit"); - - if (invalid) { - return ("abcd\r\n", false); - } - - bool incr = true; - return ($" {new DateTime(2020, 9, 28, 9, 8, 0):dd.MM.yy HH:mm} {identNr,4} {weight,9}{(unit ? "lb" : "kg")} \r\n", incr); - } + private EventMockScale Mock; + private AveryEventScale Scale; [OneTimeSetUp] public void SetupScale() { - Mock = new EventMockScale(12345, ScaleHandler); + Mock = new EventMockScale(12345, ScaleHandlers.Handle_L320); Scale = new("1", "L320", "tcp://127.0.0.1:12345"); } [OneTimeTearDown] public void TeardownScale() { - Mock?.Dispose(); - Scale?.Dispose(); + Mock.Dispose(); + Scale.Dispose(); } [SetUp] public void ResetScale() { - Mock!.IdentNr = 0; - Mock!.Weight = 0; - Mock!.Error = null; + Mock.IdentNr = 0; + Mock.Weight = 0; + Mock.Error = null; } [Test] public async Task Test_01_Normal() { WeighingResult? res = null; - Scale!.WeighingEvent += (sender, evt) => { + Scale.WeighingEvent += (sender, evt) => { res = evt.Result; }; - await Mock!.Weigh(2345); + await Mock.Weigh(2345); await Task.Delay(100); Assert.That(res, Is.Not.Null); Assert.That(res, Is.EqualTo(new WeighingResult { @@ -55,7 +42,7 @@ namespace Tests.WeighingTests { Date = new DateOnly(2020, 9, 28), Time = new TimeOnly(9, 8), })); - await Mock!.Weigh(4215); + await Mock.Weigh(4215); await Task.Delay(100); Assert.That(res, Is.Not.Null); Assert.That(res, Is.EqualTo(new WeighingResult { diff --git a/Tests/WeighingTests/ScaleTestGrInzersdorfL246.cs b/Tests/WeighingTests/ScaleTestGrInzersdorfL246.cs index b733d45..a13768b 100644 --- a/Tests/WeighingTests/ScaleTestGrInzersdorfL246.cs +++ b/Tests/WeighingTests/ScaleTestGrInzersdorfL246.cs @@ -4,78 +4,39 @@ namespace Tests.WeighingTests { [TestFixture] class ScaleTestGrInzersdorfL246 { - private MockScale? Mock; - private SysTecITScale? Scale; - - private static (string, bool) ScaleHandler(string req, int weight, string? error, int identNr) { - var modes = error?.Split(';') ?? []; - var overloaded = modes.Contains("overloaded"); - var moving = modes.Contains("moving"); - var invalid = modes.Contains("invalid"); - var crc = modes.Contains("crc"); - var unit = modes.Contains("unit"); - - if (invalid) { - return ("abcd\r\n", false); - } else if (!req.StartsWith('<') || !req.EndsWith('>')) { - return ("<31>\r\n", false); - } - req = req[1..^1]; - - bool incr; - if (req.Length > 3) { - return ("<32>\r\n", false); - } else if (req.StartsWith("RN")) { - incr = true; - } else if (req.StartsWith("RM")) { - incr = false; - } else { - return ("<32>\r\n", false); - } - - if (overloaded) - return ("<12>\r\n", false); - - if (moving && incr) - return ("<13>\r\n", false); - - string data = $"00{(moving ? 1 : 0)}0{new DateTime(2020, 10, 17, 14, 23, 0):dd.MM.yyHH:mm}{(incr ? identNr : 0),4}1" + - $"{weight,8}{0,8}{weight,8}{(unit ? "lb" : "kg")} {"001",3}"; - ushort checksum = Elwig.Helpers.Utils.CalcCrc16Modbus(data); - if (crc) checksum += 10; - return ($"<{data}{checksum,8}>\r\n", incr); - } + private MockScale Mock; + private SysTecITScale Scale; [OneTimeSetUp] public void SetupScale() { - Mock = new CommandMockScale(12345, ScaleHandler); + Mock = new CommandMockScale(12345, ScaleHandlers.Handle_L246); Scale = new("1", "L246", "tcp://127.0.0.1:12345"); } [OneTimeTearDown] public void TeardownScale() { - Mock?.Dispose(); - Scale?.Dispose(); + Mock.Dispose(); + Scale.Dispose(); } [SetUp] public void ResetScale() { - Mock!.IdentNr = 0; - Mock!.Weight = 0; - Mock!.Error = null; + Mock.IdentNr = 0; + Mock.Weight = 0; + Mock.Error = null; } [Test] public async Task Test_01_CurrentWeight() { - Mock!.Weight = 1235; + Mock.Weight = 1235; Assert.That(await Scale!.GetCurrentWeight(), Is.EqualTo(new WeighingResult { Weight = 1235, Date = new DateOnly(2020, 10, 17), Time = new TimeOnly(14, 23), })); - Mock!.Weight = 1240; + Mock.Weight = 1240; Assert.That(await Scale!.GetCurrentWeight(), Is.EqualTo(new WeighingResult { Weight = 1240, Date = new DateOnly(2020, 10, 17), Time = new TimeOnly(14, 23), })); - Mock!.Weight = 1245; + Mock.Weight = 1245; Assert.That(await Scale!.GetCurrentWeight(), Is.EqualTo(new WeighingResult { Weight = 1245, Date = new DateOnly(2020, 10, 17), Time = new TimeOnly(14, 23), })); @@ -83,19 +44,19 @@ namespace Tests.WeighingTests { [Test] public async Task Test_02_Normal() { - Mock!.Weight = 1235; + Mock.Weight = 1235; Assert.That(await Scale!.Weigh(), Is.EqualTo(new WeighingResult { Weight = 1235, WeighingId = "1", FullWeighingId = $"2020-10-17/1", Date = new DateOnly(2020, 10, 17), Time = new TimeOnly(14, 23), })); - Mock!.Weight = 3335; + Mock.Weight = 3335; Assert.That(await Scale!.Weigh(), Is.EqualTo(new WeighingResult { Weight = 3335, WeighingId = "2", FullWeighingId = $"2020-10-17/2", Date = new DateOnly(2020, 10, 17), Time = new TimeOnly(14, 23), })); - Mock!.Weight = 6420; + Mock.Weight = 6420; Assert.That(await Scale!.Weigh(), Is.EqualTo(new WeighingResult { Weight = 6420, WeighingId = "3", FullWeighingId = $"2020-10-17/3", @@ -105,39 +66,39 @@ namespace Tests.WeighingTests { [Test] public void Test_03_Moving() { - Mock!.Weight = 1_000; - Mock!.Error = "moving"; + Mock.Weight = 1_000; + Mock.Error = "moving"; IOException ex = Assert.ThrowsAsync(async () => await Scale!.Weigh()); Assert.That(ex.Message, Contains.Substring("Waage in Bewegung")); } [Test] public void Test_04_Overloaded() { - Mock!.Weight = 10_000; - Mock!.Error = "overloaded"; + Mock.Weight = 10_000; + Mock.Error = "overloaded"; IOException ex = Assert.ThrowsAsync(async () => await Scale!.Weigh()); Assert.That(ex.Message, Contains.Substring("Waage in Überlast")); } [Test] public void Test_05_InvalidResponse() { - Mock!.Weight = 1_000; - Mock!.Error = "invalid"; + Mock.Weight = 1_000; + Mock.Error = "invalid"; Assert.ThrowsAsync(async () => await Scale!.Weigh()); } [Test] public void Test_06_InvalidCrc() { - Mock!.Weight = 1_000; - Mock!.Error = "crc"; + Mock.Weight = 1_000; + Mock.Error = "crc"; IOException ex = Assert.ThrowsAsync(async () => await Scale!.Weigh()); Assert.That(ex.Message, Contains.Substring("Invalid CRC16 checksum")); } [Test] public void Test_07_InvalidUnit() { - Mock!.Weight = 1_000; - Mock!.Error = "unit"; + Mock.Weight = 1_000; + Mock.Error = "unit"; IOException ex = Assert.ThrowsAsync(async () => await Scale!.Weigh()); } } diff --git a/Tests/WeighingTests/ScaleTestMatzenIT3000A.cs b/Tests/WeighingTests/ScaleTestMatzenIT3000A.cs index 6ab91f8..1153ac9 100644 --- a/Tests/WeighingTests/ScaleTestMatzenIT3000A.cs +++ b/Tests/WeighingTests/ScaleTestMatzenIT3000A.cs @@ -4,81 +4,39 @@ namespace Tests.WeighingTests { [TestFixture] class ScaleTestMatzenIT3000A { - private MockScale? Mock; - private SysTecITScale? Scale; - - private static (string, bool) ScaleHandler(string req, int weight, string? error, int identNr) { - var modes = error?.Split(';') ?? []; - var overloaded = modes.Contains("overloaded"); - var moving = modes.Contains("moving"); - var invalid = modes.Contains("invalid"); - var crc = modes.Contains("crc"); - var unit = modes.Contains("unit"); - - if (invalid) { - return ("abcd\r\n", false); - } else if (!req.StartsWith('<') || !req.EndsWith('>')) { - return ("<31>\r\n", false); - } - req = req[1..^1]; - - bool incr; - if (req.Length > 3) { - return ("<32>\r\n", false); - } else if (req.StartsWith("RN")) { - incr = true; - } else if (req.StartsWith("RM")) { - incr = false; - } else { - return ("<32>\r\n", false); - } - - if (overloaded) { - return ("<12>\r\n", false); - } else if (weight == 0) { - incr = false; - } - - if (moving && incr) - return ("<13>\r\n", false); - - string data = $"00{(moving ? 1 : 0)}0{new DateTime(2020, 10, 15, 12, 34, 0):dd.MM.yyHH:mm}{(incr ? identNr : 0),4}1" + - $"{weight,8}{0,8}{weight,8}{(unit ? "lb" : "kg")} {"1",3}"; - ushort checksum = Elwig.Helpers.Utils.CalcCrc16Modbus(data); - if (crc) checksum += 10; - return ($"<{data}{checksum,8}>\r\n", incr); - } + private MockScale Mock; + private SysTecITScale Scale; [OneTimeSetUp] public void SetupScale() { - Mock = new CommandMockScale(12345, ScaleHandler); + Mock = new CommandMockScale(12345, ScaleHandlers.Handle_IT3000A); Scale = new("1", "IT3000A", "tcp://127.0.0.1:12345"); } [OneTimeTearDown] public void TeardownScale() { - Mock?.Dispose(); - Scale?.Dispose(); + Mock.Dispose(); + Scale.Dispose(); } [SetUp] public void ResetScale() { - Mock!.IdentNr = 0; - Mock!.Weight = 0; - Mock!.Error = null; + Mock.IdentNr = 0; + Mock.Weight = 0; + Mock.Error = null; } [Test] public async Task Test_01_CurrentWeight() { - Mock!.Weight = 1234; + Mock.Weight = 1234; Assert.That(await Scale!.GetCurrentWeight(), Is.EqualTo(new WeighingResult { Weight = 1234, Date = new DateOnly(2020, 10, 15), Time = new TimeOnly(12, 34), })); - Mock!.Weight = 1235; + Mock.Weight = 1235; Assert.That(await Scale!.GetCurrentWeight(), Is.EqualTo(new WeighingResult { Weight = 1235, Date = new DateOnly(2020, 10, 15), Time = new TimeOnly(12, 34), })); - Mock!.Weight = 1236; + Mock.Weight = 1236; Assert.That(await Scale!.GetCurrentWeight(), Is.EqualTo(new WeighingResult { Weight = 1236, Date = new DateOnly(2020, 10, 15), Time = new TimeOnly(12, 34), })); @@ -86,19 +44,19 @@ namespace Tests.WeighingTests { [Test] public async Task Test_02_Normal() { - Mock!.Weight = 1234; + Mock.Weight = 1234; Assert.That(await Scale!.Weigh(), Is.EqualTo(new WeighingResult { Weight = 1234, WeighingId = "1", FullWeighingId = $"2020-10-15/1", Date = new DateOnly(2020, 10, 15), Time = new TimeOnly(12, 34), })); - Mock!.Weight = 3333; + Mock.Weight = 3333; Assert.That(await Scale!.Weigh(), Is.EqualTo(new WeighingResult { Weight = 3333, WeighingId = "2", FullWeighingId = $"2020-10-15/2", Date = new DateOnly(2020, 10, 15), Time = new TimeOnly(12, 34), })); - Mock!.Weight = 4321; + Mock.Weight = 4321; Assert.That(await Scale!.Weigh(), Is.EqualTo(new WeighingResult { Weight = 4321, WeighingId = "3", FullWeighingId = $"2020-10-15/3", @@ -108,39 +66,39 @@ namespace Tests.WeighingTests { [Test] public void Test_03_Moving() { - Mock!.Weight = 1_000; - Mock!.Error = "moving"; + Mock.Weight = 1_000; + Mock.Error = "moving"; IOException ex = Assert.ThrowsAsync(async () => await Scale!.Weigh()); Assert.That(ex.Message, Contains.Substring("Waage in Bewegung")); } [Test] public void Test_04_Overloaded() { - Mock!.Weight = 10_000; - Mock!.Error = "overloaded"; + Mock.Weight = 10_000; + Mock.Error = "overloaded"; IOException ex = Assert.ThrowsAsync(async () => await Scale!.Weigh()); Assert.That(ex.Message, Contains.Substring("Waage in Überlast")); } [Test] public void Test_05_InvalidResponse() { - Mock!.Weight = 1_000; - Mock!.Error = "invalid"; + Mock.Weight = 1_000; + Mock.Error = "invalid"; Assert.ThrowsAsync(async () => await Scale!.Weigh()); } [Test] public void Test_06_InvalidCrc() { - Mock!.Weight = 1_000; - Mock!.Error = "crc"; + Mock.Weight = 1_000; + Mock.Error = "crc"; IOException ex = Assert.ThrowsAsync(async () => await Scale!.Weigh()); Assert.That(ex.Message, Contains.Substring("Invalid CRC16 checksum")); } [Test] public void Test_07_InvalidUnit() { - Mock!.Weight = 1_000; - Mock!.Error = "unit"; + Mock.Weight = 1_000; + Mock.Error = "unit"; IOException ex = Assert.ThrowsAsync(async () => await Scale!.Weigh()); } } diff --git a/Tests/WeighingTests/ScaleTestWolkersdorfIT6000E.cs b/Tests/WeighingTests/ScaleTestWolkersdorfIT6000E.cs index 709108f..c08c5a5 100644 --- a/Tests/WeighingTests/ScaleTestWolkersdorfIT6000E.cs +++ b/Tests/WeighingTests/ScaleTestWolkersdorfIT6000E.cs @@ -4,10 +4,10 @@ namespace Tests.WeighingTests { [TestFixture] class ScaleTestWolkersdorfIT6000E { - private MockScale? MockA; - private MockScale? MockB; - private SysTecITScale? ScaleA; - private SysTecITScale? ScaleB; + private MockScale MockA; + private MockScale MockB; + private SysTecITScale ScaleA; + private SysTecITScale ScaleB; private static (string, bool) ScaleHandler(string req, int weight, string? error, int identNr, string terminalNr) { var modes = error?.Split(';') ?? []; @@ -58,37 +58,37 @@ namespace Tests.WeighingTests { [OneTimeTearDown] public void TeardownScale() { - MockA?.Dispose(); - MockB?.Dispose(); - ScaleA?.Dispose(); - ScaleB?.Dispose(); + MockA.Dispose(); + MockB.Dispose(); + ScaleA.Dispose(); + ScaleB.Dispose(); } [SetUp] public void ResetScale() { - MockA!.IdentNr = 0; - MockA!.Weight = 0; - MockA!.Error = null; - MockB!.IdentNr = 0; - MockB!.Weight = 0; - MockB!.Error = null; + MockA.IdentNr = 0; + MockA.Weight = 0; + MockA.Error = null; + MockB.IdentNr = 0; + MockB.Weight = 0; + MockB.Error = null; } [Test] public async Task Test_01_CurrentWeight() { - MockA!.Weight = 1234; + MockA.Weight = 1234; Assert.That(await ScaleA!.GetCurrentWeight(), Is.EqualTo(new WeighingResult { Weight = 1234, Date = new DateOnly(2020, 10, 8), Time = new TimeOnly(8, 47), })); - MockB!.Weight = 3456; + MockB.Weight = 3456; Assert.That(await ScaleB!.GetCurrentWeight(), Is.EqualTo(new WeighingResult { Weight = 3456, Date = new DateOnly(2020, 10, 8), Time = new TimeOnly(8, 47), })); - MockA!.Weight = 1236; + MockA.Weight = 1236; Assert.That(await ScaleA!.GetCurrentWeight(), Is.EqualTo(new WeighingResult { Weight = 1236, Date = new DateOnly(2020, 10, 8), Time = new TimeOnly(8, 47), })); - MockB!.Weight = 3457; + MockB.Weight = 3457; Assert.That(await ScaleB!.GetCurrentWeight(), Is.EqualTo(new WeighingResult { Weight = 3457, Date = new DateOnly(2020, 10, 8), Time = new TimeOnly(8, 47), })); @@ -96,25 +96,25 @@ namespace Tests.WeighingTests { [Test] public async Task Test_02_Normal() { - MockA!.Weight = 1234; + MockA.Weight = 1234; Assert.That(await ScaleA!.Weigh(), Is.EqualTo(new WeighingResult { Weight = 1234, WeighingId = "1", FullWeighingId = $"2020-10-08/1", Date = new DateOnly(2020, 10, 8), Time = new TimeOnly(8, 47), })); - MockB!.Weight = 3456; + MockB.Weight = 3456; Assert.That(await ScaleB!.Weigh(), Is.EqualTo(new WeighingResult { Weight = 3456, WeighingId = "1", FullWeighingId = $"2020-10-08/1", Date = new DateOnly(2020, 10, 8), Time = new TimeOnly(8, 47), })); - MockA!.Weight = 4321; + MockA.Weight = 4321; Assert.That(await ScaleA!.Weigh(), Is.EqualTo(new WeighingResult { Weight = 4321, WeighingId = "2", FullWeighingId = $"2020-10-08/2", Date = new DateOnly(2020, 10, 8), Time = new TimeOnly(8, 47), })); - MockB!.Weight = 3333; + MockB.Weight = 3333; Assert.That(await ScaleB!.Weigh(), Is.EqualTo(new WeighingResult { Weight = 3333, WeighingId = "2", FullWeighingId = $"2020-10-08/2", @@ -124,39 +124,39 @@ namespace Tests.WeighingTests { [Test] public void Test_03_Moving() { - MockA!.Weight = 1_000; - MockA!.Error = "moving"; + MockA.Weight = 1_000; + MockA.Error = "moving"; IOException ex = Assert.ThrowsAsync(async () => await ScaleA!.Weigh()); Assert.That(ex.Message, Contains.Substring("Waage in Bewegung")); } [Test] public void Test_04_Overloaded() { - MockA!.Weight = 10_000; - MockA!.Error = "overloaded"; + MockA.Weight = 10_000; + MockA.Error = "overloaded"; IOException ex = Assert.ThrowsAsync(async () => await ScaleA!.Weigh()); Assert.That(ex.Message, Contains.Substring("Waage in Überlast")); } [Test] public void Test_05_InvalidResponse() { - MockA!.Weight = 1_000; - MockA!.Error = "invalid"; + MockA.Weight = 1_000; + MockA.Error = "invalid"; Assert.ThrowsAsync(async () => await ScaleA!.Weigh()); } [Test] public void Test_06_InvalidCrc() { - MockA!.Weight = 1_000; - MockA!.Error = "crc"; + MockA.Weight = 1_000; + MockA.Error = "crc"; IOException ex = Assert.ThrowsAsync(async () => await ScaleA!.Weigh()); Assert.That(ex.Message, Contains.Substring("Invalid CRC16 checksum")); } [Test] public void Test_07_InvalidUnit() { - MockA!.Weight = 1_000; - MockA!.Error = "unit"; + MockA.Weight = 1_000; + MockA.Error = "unit"; IOException ex = Assert.ThrowsAsync(async () => await ScaleA!.Weigh()); } }