using Moq; using NUnit.Framework; using StructureHelper.Models.Materials; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperLogics.Models.Materials.Logics; using StructureHelperLogics.Models.Materials; using System.Collections.Generic; namespace StructureHelperTests.UnitTests.UpdateStrategiesTests { [TestFixture] public class HasMaterialsUpdateCloningStrategyTests { private Mock _cloningStrategyMock; private HasMaterialsUpdateCloningStrategy _strategy; [SetUp] public void SetUp() { _cloningStrategyMock = new Mock(); _strategy = new HasMaterialsUpdateCloningStrategy(_cloningStrategyMock.Object); } [Test] public void Update_WithNullCloningStrategy_ThrowsStructureHelperException() { var targetObjectMock = new Mock(); var sourceObjectMock = new Mock(); Assert.Throws(() => { new HasMaterialsUpdateCloningStrategy(null).Update(targetObjectMock.Object, sourceObjectMock.Object); }); } [Test] public void Update_WithNullSourceObject_ThrowsStructureHelperException() { var targetObjectMock = new Mock(); Assert.Throws(() => { _strategy.Update(targetObjectMock.Object, null); }); } [Test] public void Update_WithNullTargetObject_ThrowsStructureHelperException() { var sourceObjectMock = new Mock(); Assert.Throws(() => { _strategy.Update(null, sourceObjectMock.Object); }); } [Test] public void Update_WithSameObjects_DoesNotPerformCloning() { var sourceObjectMock = new Mock(); _strategy.Update(sourceObjectMock.Object, sourceObjectMock.Object); _cloningStrategyMock.Verify(cs => cs.Clone(It.IsAny(), null), Times.Never); } [Test] public void Update_ClonesAndAddsEachMaterialToTarget() { // Arrange var targetMaterials = new List(); var targetObjectMock = new Mock(); targetObjectMock.SetupGet(t => t.HeadMaterials).Returns(targetMaterials); var sourceMaterials = new List { Mock.Of(m => m.Name == "Material1"), Mock.Of(m => m.Name == "Material2") }; var sourceObjectMock = new Mock(); sourceObjectMock.SetupGet(s => s.HeadMaterials).Returns(sourceMaterials); var clonedMaterial1 = Mock.Of(m => m.Name == "ClonedMaterial1"); var clonedMaterial2 = Mock.Of(m => m.Name == "ClonedMaterial2"); _cloningStrategyMock.Setup(cs => cs.Clone(sourceMaterials[0], null)).Returns(clonedMaterial1); _cloningStrategyMock.Setup(cs => cs.Clone(sourceMaterials[1], null)).Returns(clonedMaterial2); // Act _strategy.Update(targetObjectMock.Object, sourceObjectMock.Object); // Assert //Assert.IsEmpty(targetMaterials, "Target materials should be cleared before adding new ones."); Assert.That(targetMaterials, Has.Count.EqualTo(2)); Assert.That(targetMaterials, Contains.Item(clonedMaterial1)); Assert.That(targetMaterials, Contains.Item(clonedMaterial2)); _cloningStrategyMock.Verify(cs => cs.Clone(sourceMaterials[0], null), Times.Once); _cloningStrategyMock.Verify(cs => cs.Clone(sourceMaterials[1], null), Times.Once); } } }