public void Ctor()
        {
            // arrange
            var inputProperties = new List<IPropertyInfo> { ProcessScheduleEdit.HighlightScheduleDisplayDateProperty, ProcessScheduleEdit.ScheduleDisplayDateFieldProperty };
            var affectedProperties = new List<IPropertyInfo> { ProcessScheduleEdit.HighlightScheduleDisplayDateProperty, ProcessScheduleEdit.ScheduleDisplayDateFieldProperty };

            // act
            var rule = new ScheduleDateRule(ProcessScheduleEdit.HighlightScheduleDisplayDateProperty, ProcessScheduleEdit.ScheduleDisplayDateFieldProperty);

            // assert
            CollectionAssert.AreEqual(inputProperties, rule.InputProperties);
            CollectionAssert.AreEqual(affectedProperties, rule.AffectedProperties);
        }
        public void Execute()
        {
            // arrange
            var rule = new ScheduleDateRule(null, null);

            var context = Mock.Create<RuleContext>(Constructor.Mocked, Behavior.CallOriginal);
            Mock.Arrange(() => context.InputPropertyValues)
                .Returns(new Dictionary<IPropertyInfo, object> { { ProcessScheduleEdit.ScheduleDisplayDateFieldProperty, null }, { ProcessScheduleEdit.HighlightScheduleDisplayDateProperty, 0 } });

            var ruleWasThrown = false;
            Mock.Arrange(() => context.AddErrorResult(Arg.IsAny<IPropertyInfo>(), Arg.AnyString)).DoInstead(() => ruleWasThrown = true);
            

            // act
            var privateAccessor = new PrivateAccessor(rule);
            privateAccessor.CallMethod("Execute", new object[] { context });

            // assert
            Assert.IsTrue(ruleWasThrown);

            // arrange
            ruleWasThrown = false;
            Mock.Arrange(() => context.InputPropertyValues)
                .Returns(
                    new Dictionary<IPropertyInfo, object> { { ProcessScheduleEdit.ScheduleDisplayDateFieldProperty, string.Empty }, { ProcessScheduleEdit.HighlightScheduleDisplayDateProperty, 0 } });

            // act
            privateAccessor.CallMethod("Execute", new object[] { context });

            // assert
            Assert.IsTrue(ruleWasThrown);

            // arrange
            ruleWasThrown = false;
            Mock.Arrange(() => context.InputPropertyValues)
                .Returns(
                    new Dictionary<IPropertyInfo, object> { { ProcessScheduleEdit.ScheduleDisplayDateFieldProperty, "DueDate_f" }, { ProcessScheduleEdit.HighlightScheduleDisplayDateProperty, 0 } });

            // act
            privateAccessor.CallMethod("Execute", new object[] { context });

            // assert
            Assert.IsFalse(ruleWasThrown);
        }