using Moq; using NUnit.Framework; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models.Calculators; using StructureHelperLogics.NdmCalculations.Analyses.ByForces; using StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams; using StructureHelperLogics.NdmCalculations.Cracking; using System; using System.Collections.Generic; namespace StructureHelperTests.UnitTests.UpdateStrategiesTests { [TestFixture] public class HasCalculatorsUpdateCloningStrategyTests { private Mock _cloningStrategyContainerMoq; private Mock _cloningStrategyMock; private Mock> _forceCalculatorUpdateStrategyMock; private Mock> _crackCalculatorUpdateStrategyMock; private Mock> _limitCurvesCalculatorUpdateStrategyMock; private Mock> _valueDiagramCalculatorUpdateStrategyMock; private HasCalculatorsUpdateCloningStrategy _strategy; [SetUp] public void SetUp() { _cloningStrategyContainerMoq = new Mock(); _cloningStrategyMock = new Mock(); _forceCalculatorUpdateStrategyMock = new Mock>(); _crackCalculatorUpdateStrategyMock = new Mock>(); _limitCurvesCalculatorUpdateStrategyMock = new Mock>(); _valueDiagramCalculatorUpdateStrategyMock = new Mock>(); _cloningStrategyContainerMoq.Setup(m => m.ForceCalculatorStrategy).Returns(_forceCalculatorUpdateStrategyMock.Object); _cloningStrategyContainerMoq.Setup(m => m.CrackCalculatorStrategy).Returns(_crackCalculatorUpdateStrategyMock.Object); _cloningStrategyContainerMoq.Setup(m => m.LimitCurvesCalculatorStrategy).Returns(_limitCurvesCalculatorUpdateStrategyMock.Object); _cloningStrategyContainerMoq.Setup(m => m.ValueDiagramCalculatorStrategy).Returns(_valueDiagramCalculatorUpdateStrategyMock.Object); _strategy = new HasCalculatorsUpdateCloningStrategy( _cloningStrategyMock.Object, _cloningStrategyContainerMoq.Object); } [Test] public void Update_WithNullSourceObject_ThrowsException() { // Arrange var targetObject = Mock.Of(); // Act & Assert Assert.Throws(() => _strategy.Update(targetObject, null)); } [Test] public void Update_WithNullTargetObject_ThrowsException() { // Arrange var sourceObject = Mock.Of(); // Act & Assert Assert.Throws(() => _strategy.Update(null, sourceObject)); } [Test] public void Update_WithSameSourceAndTarget_DoesNothing() { // Arrange var calculators = new List { Mock.Of() }; var sourceObject = Mock.Of(s => s.Calculators == calculators); var targetObject = sourceObject; // Act _strategy.Update(targetObject, sourceObject); // Assert _cloningStrategyMock.VerifyNoOtherCalls(); _forceCalculatorUpdateStrategyMock.VerifyNoOtherCalls(); _crackCalculatorUpdateStrategyMock.VerifyNoOtherCalls(); _limitCurvesCalculatorUpdateStrategyMock.VerifyNoOtherCalls(); } [Test] public void Update_ProcessesEachCalculatorCorrectly() { // Arrange var sourceForceCalculator = Mock.Of(x => x.Name == "Force"); var sourceCrackCalculator = Mock.Of(x => x.Name == "Crack"); var sourceLimitCurvesCalculator = Mock.Of(x => x.Name == "Curves"); var sourceCalculators = new List { sourceForceCalculator, sourceCrackCalculator, sourceLimitCurvesCalculator }; var sourceObjectMock = new Mock(); sourceObjectMock.Setup(s => s.Calculators).Returns(sourceCalculators); var targetCalculators = new List(); var targetObjectMock = new Mock(); targetObjectMock.Setup(t => t.Calculators).Returns(targetCalculators); var clonedForceCalculator = Mock.Of(); var clonedCrackCalculator = Mock.Of(); var clonedLimitCurvesCalculator = Mock.Of(); _cloningStrategyMock.Setup(cs => cs.Clone(It.Is(x => x.Name == "Force"), null)).Returns(clonedForceCalculator); _cloningStrategyMock.Setup(cs => cs.Clone(It.Is(x => x.Name == "Crack"), null)).Returns(clonedCrackCalculator); _cloningStrategyMock.Setup(cs => cs.Clone(It.Is(x => x.Name == "Curves"), null)).Returns(clonedLimitCurvesCalculator); // Act _strategy.Update(targetObjectMock.Object, sourceObjectMock.Object); // Assert Assert.That(targetCalculators, Has.Count.EqualTo(3)); Assert.That(targetCalculators, Contains.Item(clonedForceCalculator)); Assert.That(targetCalculators, Contains.Item(clonedCrackCalculator)); Assert.That(targetCalculators, Contains.Item(clonedLimitCurvesCalculator)); _forceCalculatorUpdateStrategyMock.Verify(f => f.Update(clonedForceCalculator, sourceForceCalculator), Times.Once); _crackCalculatorUpdateStrategyMock.Verify(c => c.Update(clonedCrackCalculator, sourceCrackCalculator), Times.Once); _limitCurvesCalculatorUpdateStrategyMock.Verify(l => l.Update(clonedLimitCurvesCalculator, sourceLimitCurvesCalculator), Times.Once); } [Test] public void Update_WithUnknownCalculatorType_ThrowsException() { // Arrange var unknownCalculator = Mock.Of(); var sourceCalculators = new List { unknownCalculator }; var sourceObjectMock = new Mock(); sourceObjectMock.Setup(s => s.Calculators).Returns(sourceCalculators); var targetObjectMock = new Mock(); targetObjectMock.Setup(t => t.Calculators).Returns(new List()); // Act & Assert var exception = Assert.Throws(() => _strategy.Update(targetObjectMock.Object, sourceObjectMock.Object)); Assert.That(exception.Message, Does.Contain(ErrorStrings.ObjectTypeIsUnknown)); } } }