public void VerifyThatRequirementVerificationStateOfComplianceIsSetForBooleanExpressionRowViewModels(Type thingType)
        {
            var thing = Activator.CreateInstance(thingType);
            IHaveWritableRequirementStateOfCompliance row = null;

            if (thing is BooleanExpression booleanExpressionRow)
            {
                row = booleanExpressionRow.GetBooleanExpressionViewModel(this.parametricConstraintRowViewModel) as IHaveWritableRequirementStateOfCompliance;

                if (row is IRowViewModelBase <Thing> rowViewModelBase)
                {
                    this.parametricConstraintRowViewModel.ContainedRows.Add(rowViewModelBase);
                }
            }

            Assert.IsNotNull(row);

            CDPMessageBus.Current.SendMessage(new RequirementStateOfComplianceChangedEvent(RequirementStateOfCompliance.Calculating), thing);
            Assert.AreEqual(RequirementStateOfCompliance.Calculating, row.RequirementStateOfCompliance);

            CDPMessageBus.Current.SendMessage(new RequirementStateOfComplianceChangedEvent(RequirementStateOfCompliance.Pass), thing);
            Assert.AreEqual(RequirementStateOfCompliance.Pass, row.RequirementStateOfCompliance);

            if (thingType == typeof(RelationalExpression) && row is IHaveContainerViewModel)
            {
                CDPMessageBus.Current.SendMessage(new RequirementStateOfComplianceChangedEvent(RequirementStateOfCompliance.Unknown), typeof(ParameterOrOverrideBase));
                Assert.AreEqual(RequirementStateOfCompliance.Unknown, row.RequirementStateOfCompliance);
                Assert.AreEqual(RequirementStateOfCompliance.Unknown, this.parametricConstraintRowViewModel.RequirementStateOfCompliance);
            }
        }
 /// <summary>
 /// Reset the <see cref="RequirementStateOfCompliance"/> tree of ViewModels that implement <see cref="IHaveWritableRequirementStateOfCompliance"/> and <see cref="IHaveContainerViewModel"/> to <see cref="RequirementStateOfCompliance.Unknown"/>
 /// </summary>
 /// <param name="requirementStateOfComplianceObject">The <see cref="IHaveWritableRequirementStateOfCompliance"/> implementation</param>
 private static void ResetRequirementStateOfComplianceTree(IHaveWritableRequirementStateOfCompliance requirementStateOfComplianceObject)
 {
     if (requirementStateOfComplianceObject is IHaveContainerViewModel containerViewModel)
     {
         containerViewModel.ResetRequirementStateOfComplianceTree();
     }
 }
        /// <summary>
        /// Creates a reactive subscriptions for a <see cref="IHaveWritableRequirementStateOfCompliance"/> object
        /// </summary>
        /// <param name="requirementStateOfComplianceObject">The <see cref="IHaveWritableRequirementStateOfCompliance"/></param>
        /// <param name="thing">The <see cref="Thing"/> that te subscription is set for</param>
        /// <param name="disposables">The <see cref="ICollection{IDisposable}"/> where the subscription must be added to to avoid memory leaks</param>
        public static void SetRequirementStateOfComplianceChangedEventSubscription(this IHaveWritableRequirementStateOfCompliance requirementStateOfComplianceObject, Thing thing, ICollection <IDisposable> disposables)
        {
            var requirementVerifierListener = CDPMessageBus.Current.Listen <RequirementStateOfComplianceChangedEvent>(thing)
                                              .ObserveOn(RxApp.MainThreadScheduler)
                                              .Subscribe(x => SetRequirementStateOfCompliance(requirementStateOfComplianceObject, x));

            disposables?.Add(requirementVerifierListener);

            if (thing is RelationalExpression)
            {
                var resetRequirementVerifierListener = CDPMessageBus.Current.Listen <RequirementStateOfComplianceChangedEvent>(typeof(ParameterOrOverrideBase))
                                                       .ObserveOn(RxApp.MainThreadScheduler)
                                                       .Subscribe(x => { ResetRequirementStateOfComplianceTree(requirementStateOfComplianceObject); });

                disposables?.Add(resetRequirementVerifierListener);
            }
        }
 /// <summary>
 /// Actually sets the <see cref="IHaveWritableRequirementStateOfCompliance.RequirementStateOfCompliance"/> property.
 /// </summary>
 /// <param name="requirementStateOfComplianceObject">The <see cref="IHaveWritableRequirementStateOfCompliance"/> implementation</param>
 /// <param name="requirementStateOfComplianceChangedEvent">The <see cref="RequirementStateOfComplianceChangedEvent"/></param>
 private static void SetRequirementStateOfCompliance(IHaveWritableRequirementStateOfCompliance requirementStateOfComplianceObject, RequirementStateOfComplianceChangedEvent requirementStateOfComplianceChangedEvent)
 {
     requirementStateOfComplianceObject.RequirementStateOfCompliance = requirementStateOfComplianceChangedEvent.RequirementStateOfCompliance;
 }