using Moq; using NUnit.Framework; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Models; using StructureHelperLogics.Models.BeamShears; namespace StructureHelperTests.UnitTests.BeamShearTests { [TestFixture] public class BeamShearStrengthByStirrupDensityTests { private Mock _mockStirrupEffectiveness; private Mock _mockStirrupByDensity; private Mock _mockInclinedSection; private Mock _mockTraceLogger; private StirrupByDensityStrengthLogic _beamShearStrength; [SetUp] public void Setup() { _mockStirrupEffectiveness = new Mock(); _mockStirrupByDensity = new Mock(); _mockInclinedSection = new Mock(); _mockTraceLogger = new Mock(); _beamShearStrength = new StirrupByDensityStrengthLogic( _mockStirrupEffectiveness.Object, _mockStirrupByDensity.Object, _mockInclinedSection.Object, _mockTraceLogger.Object ); } [TestCase(0.2, 0.48)] [TestCase(0.5, 1.2)] [TestCase(1.1, 2.64)] [TestCase(2.2, 2.64)] public void GetShearStrength_CalculatesCorrectly_differentStirrupEnd(double stirrupEnd, double expectedStrength) { // Arrange _mockInclinedSection.Setup(s => s.StartCoord).Returns(0); _mockInclinedSection.Setup(s => s.EndCoord).Returns(100); _mockInclinedSection.Setup(s => s.EffectiveDepth).Returns(0.55); _mockStirrupEffectiveness.Setup(s => s.MaxCrackLengthRatio).Returns(2.0); _mockStirrupEffectiveness.Setup(s => s.StirrupShapeFactor).Returns(0.8); _mockStirrupEffectiveness.Setup(s => s.StirrupPlacementFactor).Returns(0.75); _mockStirrupEffectiveness.Setup(s => s.MinimumStirrupRatio).Returns(0.25); _mockStirrupByDensity.Setup(s => s.StirrupDensity).Returns(4.0); _mockStirrupByDensity.Setup(s => s.StartCoordinate).Returns(0); _mockStirrupByDensity.Setup(s => s.EndCoordinate).Returns(stirrupEnd); // Act double result = _beamShearStrength.CalculateShearStrength(); // Assert Assert.That(result, Is.EqualTo(expectedStrength).Within(1e-6)); _mockTraceLogger.Verify(t => t.AddMessage(It.IsAny(), It.IsAny()), Times.AtLeastOnce); } [TestCase(0.20, 0.48)] [TestCase(0.55, 1.32)] [TestCase(1.1, 2.64)] [TestCase(2.2, 2.64)] public void GetShearStrength_CalculatesCorrectly_differentInclinedSectionEnd(double inclinedSectionEnd, double expectedStrength) { // Arrange _mockInclinedSection.Setup(s => s.StartCoord).Returns(0); _mockInclinedSection.Setup(s => s.EndCoord).Returns(inclinedSectionEnd); _mockInclinedSection.Setup(s => s.EffectiveDepth).Returns(0.55); _mockStirrupEffectiveness.Setup(s => s.MaxCrackLengthRatio).Returns(2.0); _mockStirrupEffectiveness.Setup(s => s.StirrupShapeFactor).Returns(0.8); _mockStirrupEffectiveness.Setup(s => s.StirrupPlacementFactor).Returns(0.75); _mockStirrupEffectiveness.Setup(s => s.MinimumStirrupRatio).Returns(0.25); _mockStirrupByDensity.Setup(s => s.StirrupDensity).Returns(4.0); _mockStirrupByDensity.Setup(s => s.StartCoordinate).Returns(0); _mockStirrupByDensity.Setup(s => s.EndCoordinate).Returns(100); // Act double result = _beamShearStrength.CalculateShearStrength(); // Assert Assert.That(result, Is.EqualTo(expectedStrength).Within(1e-6)); _mockTraceLogger.Verify(t => t.AddMessage(It.IsAny(), It.IsAny()), Times.AtLeastOnce); } [TestCase(0.2, 0.66)] [TestCase(0.5, 1.65)] [TestCase(0.8, 2.64)] public void GetShearStrength_CalculatesCorrectly_differentShapeFactor(double shapeFactor, double expectedStrength) { // Arrange _mockInclinedSection.Setup(s => s.StartCoord).Returns(0); _mockInclinedSection.Setup(s => s.EndCoord).Returns(1.1); _mockInclinedSection.Setup(s => s.EffectiveDepth).Returns(0.55); _mockStirrupEffectiveness.Setup(s => s.MaxCrackLengthRatio).Returns(2.0); _mockStirrupEffectiveness.Setup(s => s.StirrupShapeFactor).Returns(shapeFactor); _mockStirrupEffectiveness.Setup(s => s.StirrupPlacementFactor).Returns(0.75); _mockStirrupEffectiveness.Setup(s => s.MinimumStirrupRatio).Returns(0.25); _mockStirrupByDensity.Setup(s => s.StirrupDensity).Returns(4.0); _mockStirrupByDensity.Setup(s => s.StartCoordinate).Returns(0); _mockStirrupByDensity.Setup(s => s.EndCoordinate).Returns(100); // Act double result = _beamShearStrength.CalculateShearStrength(); // Assert Assert.That(result, Is.EqualTo(expectedStrength).Within(1e-6)); _mockTraceLogger.Verify(t => t.AddMessage(It.IsAny(), It.IsAny()), Times.AtLeastOnce); } [TestCase(0.2, 0.704)] [TestCase(0.5, 1.76)] [TestCase(0.8, 2.816)] public void GetShearStrength_CalculatesCorrectly_differentPlacementFactor(double placementFactor, double expectedStrength) { // Arrange _mockInclinedSection.Setup(s => s.StartCoord).Returns(0); _mockInclinedSection.Setup(s => s.EndCoord).Returns(1.1); _mockInclinedSection.Setup(s => s.EffectiveDepth).Returns(0.55); _mockStirrupEffectiveness.Setup(s => s.MaxCrackLengthRatio).Returns(2.0); _mockStirrupEffectiveness.Setup(s => s.StirrupShapeFactor).Returns(0.8); _mockStirrupEffectiveness.Setup(s => s.StirrupPlacementFactor).Returns(placementFactor); _mockStirrupEffectiveness.Setup(s => s.MinimumStirrupRatio).Returns(0.25); _mockStirrupByDensity.Setup(s => s.StirrupDensity).Returns(4.0); _mockStirrupByDensity.Setup(s => s.StartCoordinate).Returns(0); _mockStirrupByDensity.Setup(s => s.EndCoordinate).Returns(100); // Act double result = _beamShearStrength.CalculateShearStrength(); // Assert Assert.That(result, Is.EqualTo(expectedStrength).Within(1e-6)); _mockTraceLogger.Verify(t => t.AddMessage(It.IsAny(), It.IsAny()), Times.AtLeastOnce); } [Test] public void GetShearStrength_ThrowsException_WhenDependenciesAreNull() { // Arrange var invalidInstance = new StirrupByDensityStrengthLogic( _mockStirrupEffectiveness.Object, null, // Invalid _mockInclinedSection.Object, _mockTraceLogger.Object ); // Act & Assert Assert.Throws(() => invalidInstance.CalculateShearStrength()); } } }