using Moq; using NUnit.Framework; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperLogics.NdmCalculations.Cracking; namespace StructureHelperTests.UnitTests.UpdateStrategiesTests { [TestFixture] public class CrackCalculatorUpdateStrategyTests { private Mock> _inputDataUpdateStrategyMock; private CrackCalculatorUpdateStrategy _crackCalculatorUpdateStrategy; [SetUp] public void SetUp() { _inputDataUpdateStrategyMock = new Mock>(); _crackCalculatorUpdateStrategy = new CrackCalculatorUpdateStrategy(_inputDataUpdateStrategyMock.Object); } [Test] public void Update_WhenTargetAndSourceAreSameObject_DoesNotCallInputDataUpdateStrategy() { // Arrange var calculator = new Mock().Object; // Act _crackCalculatorUpdateStrategy.Update(calculator, calculator); // Assert _inputDataUpdateStrategyMock.Verify(s => s.Update(It.IsAny(), It.IsAny()), Times.Never); } [Test] public void Update_WhenSourceObjectIsNull_ThrowsArgumentNullException() { // Arrange var targetObject = new Mock().Object; // Act & Assert Assert.Throws(() => _crackCalculatorUpdateStrategy.Update(targetObject, null)); } [Test] public void Update_WhenTargetObjectIsNull_ThrowsArgumentNullException() { // Arrange var sourceObject = new Mock().Object; // Act & Assert Assert.Throws(() => _crackCalculatorUpdateStrategy.Update(null, sourceObject)); } [Test] public void Update_UpdatesTargetObjectNameAndCallsInputDataUpdateStrategy() { // Arrange var targetObject = new Mock(); var sourceObject = new Mock(); var targetInputData = new Mock().Object; var sourceInputData = new Mock().Object; targetObject.SetupAllProperties(); targetObject.Object.InputData = targetInputData; sourceObject.SetupAllProperties(); sourceObject.Object.InputData = sourceInputData; sourceObject.Setup(x => x.Name).Returns("Source Name"); // Act _crackCalculatorUpdateStrategy.Update(targetObject.Object, sourceObject.Object); // Assert Assert.AreEqual("Source Name", targetObject.Object.Name); _inputDataUpdateStrategyMock.Verify(s => s.Update(targetInputData, sourceInputData), Times.Once); } [Test] public void Update_WhenTargetInputDataIsNull_CreatesNewInputDataAndUpdatesIt() { // Arrange var targetObject = new Mock(); var sourceObject = new Mock(); var sourceInputData = new Mock().Object; targetObject.SetupAllProperties(); targetObject.Object.InputData = null; sourceObject.SetupAllProperties(); sourceObject.Object.InputData = sourceInputData; // Act _crackCalculatorUpdateStrategy.Update(targetObject.Object, sourceObject.Object); // Assert Assert.IsNotNull(targetObject.Object.InputData); _inputDataUpdateStrategyMock.Verify(s => s.Update(targetObject.Object.InputData, sourceInputData), Times.Once); } } }