Index: Riskeer/Integration/src/Riskeer.Integration.IO/Factories/ExportableFailureMechanismSectionAssemblyResultFactory.cs =================================================================== diff -u -r4f65751c794c7d4631e2c952be7e1a6a50334056 -rc97ad8e19de53a2c9288e5ed7625e2a5bdcde03e --- Riskeer/Integration/src/Riskeer.Integration.IO/Factories/ExportableFailureMechanismSectionAssemblyResultFactory.cs (.../ExportableFailureMechanismSectionAssemblyResultFactory.cs) (revision 4f65751c794c7d4631e2c952be7e1a6a50334056) +++ Riskeer/Integration/src/Riskeer.Integration.IO/Factories/ExportableFailureMechanismSectionAssemblyResultFactory.cs (.../ExportableFailureMechanismSectionAssemblyResultFactory.cs) (revision c97ad8e19de53a2c9288e5ed7625e2a5bdcde03e) @@ -89,6 +89,11 @@ throw new ArgumentNullException(nameof(assemblyFunc)); } + if (registry.Contains(sectionResult)) + { + return registry.Get(sectionResult); + } + FailureMechanismSectionAssemblyResultWrapper assemblyResultWrapper = assemblyFunc( sectionResult, failureMechanism, assessmentSection); FailureMechanismSectionAssemblyResult assemblyResult = assemblyResultWrapper.AssemblyResult; @@ -99,12 +104,15 @@ throw new AssemblyFactoryException("The assembly result is invalid and cannot be created."); } - return new ExportableFailureMechanismSectionAssemblyResult( + var exportableFailureMechanismSectionAssemblyResult = new ExportableFailureMechanismSectionAssemblyResult( idGenerator.GetNewId(Resources.ExportableFailureMechanismSectionAssemblyResult_IdPrefix), registry.Get(sectionResult.Section), assemblyResult.SectionProbability, assemblyResult.FailureMechanismSectionAssemblyGroup, ExportableAssemblyMethodConverter.ConvertTo(assemblyResultWrapper.AssemblyGroupMethod), ExportableAssemblyMethodConverter.ConvertTo(assemblyResultWrapper.ProbabilityMethod)); + + registry.Register(sectionResult, exportableFailureMechanismSectionAssemblyResult); + return exportableFailureMechanismSectionAssemblyResult; } } } \ No newline at end of file Index: Riskeer/Integration/test/Riskeer.Integration.IO.Test/Factories/ExportableFailureMechanismSectionAssemblyResultFactoryTest.cs =================================================================== diff -u -r4f65751c794c7d4631e2c952be7e1a6a50334056 -rc97ad8e19de53a2c9288e5ed7625e2a5bdcde03e --- Riskeer/Integration/test/Riskeer.Integration.IO.Test/Factories/ExportableFailureMechanismSectionAssemblyResultFactoryTest.cs (.../ExportableFailureMechanismSectionAssemblyResultFactoryTest.cs) (revision 4f65751c794c7d4631e2c952be7e1a6a50334056) +++ Riskeer/Integration/test/Riskeer.Integration.IO.Test/Factories/ExportableFailureMechanismSectionAssemblyResultFactoryTest.cs (.../ExportableFailureMechanismSectionAssemblyResultFactoryTest.cs) (revision c97ad8e19de53a2c9288e5ed7625e2a5bdcde03e) @@ -201,5 +201,39 @@ ExportableFailureMechanismSectionAssemblyResultTestHelper.AssertExportableFailureMechanismSectionResult( expectedSectionOutput, assemblyResult, registry.Get(failureMechanism.Sections.First())); } + + [Test] + public void Create_SectionResultAlreadyRegistered_ReturnsRegisteredExportableFailureMechanismSectionAssemblyResult() + { + // Setup + var random = new Random(21); + var failureMechanism = new TestFailureMechanism(); + FailureMechanismTestHelper.AddSections(failureMechanism, random.Next(2, 10)); + var assessmentSection = new AssessmentSectionStub(); + + FailureMechanismSectionAssemblyResultWrapper expectedSectionOutput = FailureMechanismSectionAssemblyResultWrapperTestFactory.Create(); + + var idGenerator = new IdentifierGenerator(); + + var registry = new ExportableModelRegistry(); + ExportableFailureMechanismSectionCollectionFactory.CreateExportableFailureMechanismSectionCollection( + new IdentifierGenerator(), registry, failureMechanism.Sections); + + TestFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.First(); + ExportableFailureMechanismSectionAssemblyResult assemblyResult1 = ExportableFailureMechanismSectionAssemblyResultFactory.Create( + idGenerator, registry, sectionResult, failureMechanism, assessmentSection, + (sr, fm, section) => expectedSectionOutput); + + // Precondition + Assert.True(registry.Contains(sectionResult)); + + // Call + ExportableFailureMechanismSectionAssemblyResult assemblyResult2 = ExportableFailureMechanismSectionAssemblyResultFactory.Create( + idGenerator, registry, sectionResult, failureMechanism, assessmentSection, + (sr, fm, section) => expectedSectionOutput); + + // Assert + Assert.AreSame(assemblyResult1, assemblyResult2); + } } } \ No newline at end of file