public void TestBackwardSchedulingTransitionTimeForeachOperationIsCorrect(
            string testConfigurationFileName)
        {
            InitThisTest(testConfigurationFileName);

            IDbTransactionData dbTransactionData =
                ZppConfiguration.CacheManager.ReloadTransactionData();

            foreach (var productionOrderBomAsDemand in dbTransactionData.ProductionOrderBomGetAll())
            {
                ProductionOrderBom productionOrderBom =
                    (ProductionOrderBom)productionOrderBomAsDemand;
                int expectedStartBackward = productionOrderBom.GetStartTimeBackward().GetValue() +
                                            TransitionTimer.GetTransitionTimeFactor() *
                                            productionOrderBom.GetDurationOfOperation().GetValue();
                int actualStartBackward = productionOrderBom.GetStartTimeOfOperation().GetValue();
                Assert.True(expectedStartBackward.Equals(actualStartBackward),
                            $"The transition time before operationStart is not correct: " +
                            $"expectedStartBackward: {expectedStartBackward}, actualStartBackward {actualStartBackward}");

                int expectedEndBackward = productionOrderBom.GetStartTimeOfOperation().GetValue() +
                                          productionOrderBom.GetDurationOfOperation().GetValue();
                int actualEndBackward = productionOrderBom.GetEndTimeBackward().GetValue();
                Assert.True(expectedEndBackward.Equals(actualEndBackward),
                            $"EndBackward is not correct: " +
                            $"expectedEndBackward: {expectedEndBackward}, actualEndBackward {actualEndBackward}");
            }
        }
        /**
         * Bottom-Up-Traversal
         */
        private void ValidatePredecessorOperationsTransitionTimeIsCorrect(
            IStackSet <ProductionOrderOperation> predecessorOperations,
            ProductionOrderOperation lastOperation,
            IDirectedGraph <INode> operationGraph,
            IStackSet <INode> traversedOperations)
        {
            if (predecessorOperations == null)
            {
                return;
            }

            foreach (var currentPredecessor in predecessorOperations)
            {
                if (currentPredecessor.GetType() == typeof(ProductionOrderOperation))
                {
                    ProductionOrderOperation currentOperation = currentPredecessor;
                    traversedOperations.Push(new Node(currentPredecessor));

                    // transition time MUST be before the start of Operation
                    int expectedStartBackwardLowerLimit =
                        lastOperation.GetValue().EndBackward.GetValueOrDefault() +
                        TransitionTimer.GetTransitionTimeFactor() *
                        currentOperation.GetValue().Duration;
                    int actualStartBackward = currentOperation.GetValue().StartBackward
                                              .GetValueOrDefault();
                    Assert.True(actualStartBackward >= expectedStartBackwardLowerLimit,
                                $"The transition time between the operations is not correct: " +
                                $"expectedStartBackward: {expectedStartBackwardLowerLimit}, actualStartBackward {actualStartBackward}");

                    INodes predecessorNodesRecursive =
                        operationGraph.GetPredecessorNodesRecursive(new Node(currentPredecessor));
                    if (predecessorNodesRecursive != null)
                    {
                        IStackSet <ProductionOrderOperation> newPredecessorNodes =
                            new StackSet <ProductionOrderOperation>(
                                predecessorNodesRecursive.Select(x =>
                                                                 (ProductionOrderOperation)x.GetEntity()));
                        ValidatePredecessorOperationsTransitionTimeIsCorrect(newPredecessorNodes,
                                                                             currentOperation, operationGraph, traversedOperations);
                    }
                }
                else
                {
                    throw new MrpRunException(
                              "ProductionOrderToOperationGraph should only contain productionOrders/operations.");
                }
            }
        }