/// <summary>
        /// Tests the interpretation categories.
        /// </summary>
        /// <param name="input">The input.</param>
        /// <param name="result">The result.</param>
        public static void TestEqualInterpretationCategories(BenchmarkTestInput input, BenchmarkTestResult result)
        {
            var calculator = new CategoryLimitsCalculator();

            // WBI-2-1
            CategoriesList <InterpretationCategory> categories = calculator.CalculateInterpretationCategoryLimitsWbi03(
                new AssessmentSection((Probability)input.SignalingNorm, (Probability)input.LowerBoundaryNorm));
            CategoriesList <InterpretationCategory> expectedCategories = input.ExpectedInterpretationCategories;

            result.AreEqualCategoriesListInterpretationCategories =
                AssertHelper.AssertEqualCategoriesList <InterpretationCategory, EInterpretationCategory>(
                    expectedCategories, categories);
            result.MethodResults.Wbi03 = result.AreEqualCategoriesListInterpretationCategories;
        }
        public void FullAssembly()
        {
            const int sectionLength = 3750;
            var       section       = new AssessmentSection((Probability)1.0E-3, (Probability)(1.0 / 300.0));
            var       failureMechanismSectionResultsDictionary = new Dictionary <double, List <FailureMechanismSection> >();
            var       failureMechanismSectionLists             = new List <FailureMechanismSectionList>();

            // create section results for 15 failure mechanisms with 250 sections each
            CreateTestInput(sectionLength, failureMechanismSectionResultsDictionary);

            // start timer
            var watch = Stopwatch.StartNew();

            var failureMechanismResultsWithFailureProb = new List <FailureMechanismAssemblyResult>();

            // assembly step 1
            var categoriesCalculator = new CategoryLimitsCalculator();

            foreach (var failureMechanismSectionResults in failureMechanismSectionResultsDictionary)
            {
                var result = failureMechanismResultAssembler.AssembleFailureMechanismWbi1B1(
                    failureMechanismSectionResults.Key,
                    failureMechanismSectionResults.Value.Select(failureMechanismSection => failureMechanismSection.Result),
                    false);
                failureMechanismResultsWithFailureProb.Add(result);

                failureMechanismSectionLists.Add(CreateFailureMechanismSectionListForStep3(failureMechanismSectionResults.Value));
            }

            // assembly step 2
            var categories = categoriesCalculator.CalculateAssessmentSectionCategoryLimitsWbi21(section);
            var assessmentGradeWithFailureProb =
                assessmentSectionAssembler.AssembleAssessmentSectionWbi2B1(failureMechanismResultsWithFailureProb.Select(r => r.Probability).ToArray(), categories, false);

            // assembly step 3
            combinedSectionAssembler.AssembleCommonFailureMechanismSections(failureMechanismSectionLists, sectionLength, false);
            watch.Stop();

            var elapsedMs = watch.Elapsed.TotalMilliseconds;

            Console.Out.WriteLine($"Elapsed time since start of assembly: {elapsedMs} ms (max: 1000 ms)");
        }