public void Use_CheckFactory_for_creating_checks()
        {
            var behaviorFactory = Substitute.For <INZazuWpfFieldBehaviorFactory>();
            var serializer      = Substitute.For <INZazuTableDataSerializer>();
            var checkFactory    = Substitute.For <ICheckFactory>();

            var checkDefinition = new CheckDefinition {
                Type = "required"
            };
            var fieldDefinition = new FieldDefinition {
                Key = "test", Type = "string", Checks = new[] { checkDefinition }
            };
            var check = new RequiredCheck(checkDefinition.Settings, null, null, 0, fieldDefinition);

            checkFactory.CreateCheck(checkDefinition, fieldDefinition, Arg.Any <Func <FormData> >(),
                                     Arg.Any <INZazuTableDataSerializer>(), Arg.Any <int>()).Returns(check);

            var sut = new NZazuFieldFactory();

            sut.Use(behaviorFactory);
            sut.Use(checkFactory);
            sut.Use(serializer);

            var field = (NZazuField)sut.CreateField(fieldDefinition);

            checkFactory.Received(1).CreateCheck(checkDefinition, fieldDefinition, Arg.Any <Func <FormData> >(),
                                                 Arg.Any <INZazuTableDataSerializer>(), Arg.Any <int>());

            field.Should().NotBeNull();
            field.Check.Should().Be(check);
        }
        public void Use_AggregateCheck_for_multiple_checks()
        {
            var behaviorFactory = Substitute.For <INZazuWpfFieldBehaviorFactory>();
            var serializer      = Substitute.For <INZazuTableDataSerializer>();
            var checkFactory    = Substitute.For <ICheckFactory>();

            var checkDefinition1 = new CheckDefinition {
                Type = "required"
            };
            var checkDefinition2 = new CheckDefinition
            {
                Type = "length", Settings = new Dictionary <string, string> {
                    { "Min", "4" }, { "Max", "6" }
                }
            };
            var fieldDefinition = new FieldDefinition
            {
                Key    = "test",
                Type   = "string",
                Checks = new[] { checkDefinition1, checkDefinition2 }
            };
            var check1 = new RequiredCheck(checkDefinition1.Settings, null, null, 0, fieldDefinition);
            var check2 = new StringLengthCheck(checkDefinition2.Settings, null, null, 0, fieldDefinition);

            checkFactory.CreateCheck(checkDefinition1, fieldDefinition, Arg.Any <Func <FormData> >(),
                                     Arg.Any <INZazuTableDataSerializer>(), Arg.Any <int>()).Returns(check1);
            checkFactory.CreateCheck(checkDefinition2, fieldDefinition, Arg.Any <Func <FormData> >(),
                                     Arg.Any <INZazuTableDataSerializer>(), Arg.Any <int>()).Returns(check2);

            var sut = new NZazuFieldFactory();

            sut.Use(behaviorFactory);
            sut.Use(checkFactory);
            sut.Use(serializer);

            var field = (NZazuField)sut.CreateField(fieldDefinition);

            checkFactory.Received(1).CreateCheck(checkDefinition1, fieldDefinition, Arg.Any <Func <FormData> >(),
                                                 Arg.Any <INZazuTableDataSerializer>(), Arg.Any <int>());
            checkFactory.Received(1).CreateCheck(checkDefinition2, fieldDefinition, Arg.Any <Func <FormData> >(),
                                                 Arg.Any <INZazuTableDataSerializer>(), Arg.Any <int>());

            var aggregateCheck = (AggregateCheck)field.Check;

            aggregateCheck.Should().NotBeNull();
            aggregateCheck.Checks.Should().BeEquivalentTo(check1, check2);
        }