Пример #1
0
        public IEnumerable <RuleValidationMessage> Validate(T rule)
        {
            List <RuleValidationMessage> createRuleValidationMessages = new List <RuleValidationMessage>(0);

            List <IInvariant <T> > createRuleInvariants = new List <IInvariant <T> >(0);

            foreach (Type invariantType in this.InvariantTypes)
            {
                IInvariant <T> createRuleInvariant = this.invariantFactory.GetRuleInvariant(invariantType);
                createRuleInvariants.Add(createRuleInvariant);
            }

            foreach (IInvariant <T> createRuleInvariant in createRuleInvariants)
            {
                InvariantResult invariantResult = createRuleInvariant.IsValid(rule);

                if (!invariantResult.Valid)
                {
                    foreach (string message in invariantResult.Messages)
                    {
                        createRuleValidationMessages.Add(new RuleValidationMessage
                        {
                            Code    = invariantResult.Code,
                            Message = message
                        });
                    }
                }
            }

            return(createRuleValidationMessages);
        }
Пример #2
0
        public void NeighboursInBlockForMultipleBondsIgnoringBondOrders()
        {
            string         acpString = "C0C1C2C3C4 0:1(1),0:2(2),0:3(1),1:4(1),2:4(1),3:4(2)";
            IAtomContainer ac        = AtomContainerPrinter.FromString(acpString, builder);
            AtomRefinable  refinable = new AtomRefinable(ac, false, true);

            IInvariant invariant = refinable.NeighboursInBlock(Set(1, 2), 0);

            Assert.IsTrue(invariant is IntegerInvariant);
            Assert.AreEqual(new IntegerInvariant(2), invariant);
        }
Пример #3
0
        public void NeighboursInBlockForSingleBonds()
        {
            string         acpString = "C0C1C2C3 0:1(1),0:3(1),1:2(1),2:3(1)";
            IAtomContainer ac        = AtomContainerPrinter.FromString(acpString, builder);
            AtomRefinable  refinable = new AtomRefinable(ac);

            IInvariant invariant = refinable.NeighboursInBlock(Set(0, 2), 1);

            Assert.IsTrue(invariant is IntegerInvariant);
            Assert.AreEqual(new IntegerInvariant(2), invariant);
        }
Пример #4
0
        public InvariantLawsTests(IInvariant <TF> invariant, IEqK <TF> eqK)
        {
            var invariantLaws = new InvariantLaws <TF>(invariant);

            Add("Invariant Identity", args =>
                invariantLaws.InvariantIdentity(args.LiftedA).Holds(eqK));

            Add("Invariant Composition", args =>
                invariantLaws
                .InvariantComposition(args.LiftedA, args.FuncAtoB, args.FuncBtoA, args.FuncBtoC, args.FuncCtoB)
                .Holds(eqK));
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="VarianceExample"/> class.
        /// </summary>
        /// <param name="orangeInvariant">An interface with an invariant type of
        /// <see cref="Orange"/>.</param>
        /// <param name="bananaCovariant">An interface with a covariant type of
        /// <see cref="Banana"/>.</param>
        /// <param name="fruitContravariant">An interface with a contravariant type of
        /// <see cref="Fruit"/>.</param>
        /// <exception cref="ArgumentNullException"><paramref name="orangeInvariant"/>,
        /// <paramref name="bananaCovariant"/>, or <paramref name="fruitContravariant"/> is
        /// <see langword="null"/>.</exception>
        public VarianceExample(
            IInvariant <Orange> orangeInvariant,
            ICovariant <Banana> bananaCovariant,
            IContravariant <Fruit> fruitContravariant)
        {
            ParameterValidation.IsNotNull(orangeInvariant, nameof(orangeInvariant));
            ParameterValidation.IsNotNull(bananaCovariant, nameof(bananaCovariant));
            ParameterValidation.IsNotNull(fruitContravariant, nameof(fruitContravariant));

            this.orangeInvariantInterface    = orangeInvariant;
            this.bananaCovariantInterface    = bananaCovariant;
            this.fruitContravariantInterface = fruitContravariant;
        }
Пример #6
0
 public int CompareTo(IInvariant o)
 {
     int[] other = ((IntegerListInvariant)o).values;
     for (int index = 0; index < values.Length; index++)
     {
         if (values[index] > other[index])
         {
             return(-1);
         }
         else if (values[index] < other[index])
         {
             return(1);
         }
         else
         {
             continue;
         }
     }
     return(0);
 }
Пример #7
0
 public InvariantLaws(IInvariant <TF> invariant) => _invariant = invariant;
 public void M(IInvariant <object> v)
 {     /* ... */
 }
        static void Main(string[] args)
        {
            //
            // 1. 다형성
            //
            // 좌측 = 우측
            // 생성 타입 | 부모 타입 = 생성 타입
            //
            string s = "Hello";
            object o = s;                                   // 부모 타입

            Level2 l22 = new Level2();                      // 같은 타입(불변)
            Level1 l12 = new Level2();                      // 부모 타입
            //Level3 l32 = new Level2();                    // 자식 타입, 에러


            //
            // 2. Generic 불변성
            //
            IEnumerable <Level2>        y = null;
            Dictionary <Level2, Level2> x = null;
            List <Level2> values22        = new List <Level2>(); // 같은 타입
            //List<Level1> values12 = new List<Level2>();   // 부모 타입, 에러
            //List<Level3> values32 = new List<Level2>();   // 자식 타입, 에러

            IInvariant <Level2> valuei22 = null;
            IInvariant <Level2> i22      = valuei22;        // 같은 타입
            //IInvariant<Level1> i12 = valuei22;            // 부모 타입, 에러
            //IInvariant<Level3> i32 = valuei22;            // 자식 타입, 에러


            //
            // 3. Generic 공변성
            //
            //  Level1 → IWriteOnlyRepo<Level1>
            //    ↑          ↑
            //  Level2 → IWriteOnlyRepo<Level2>
            //
            IReadOnlyRepo <Level2> out22 = null;
            IReadOnlyRepo <Level2> wo22  = out22;           // 같은 타입
            IReadOnlyRepo <Level1> wo12  = out22;           // 부모 타입
            //IWriteOnlyRepo<Level3> wo32 = out22;          // 자식 타입, 에러

            Func <Level2> fun22 = Program.Fun;               // 같은 타입
            Func <Level1> fun12 = Program.Fun;               // 부모 타입
            //Func<Level3> fun32 = Program.Fun;               // 자식 타입, 에러


            //
            // 4. Generic 반공변성(상속 관계가 역전된다)
            //
            //  Level2 ↘ IWriteOnlyRepo<Level3>
            //    ↑          ↑
            //  Level3 ↗ IWriteOnlyRepo<Level2>
            //
            //
            IWriteOnlyRepo <Level2> in22 = null;
            IWriteOnlyRepo <Level2> ro22 = in22;             // 같은 타입
            //IReadOnlyRepo<Level1> ro12 = in22;            // 부모 타입, 에러
            IWriteOnlyRepo <Level3> ro31 = in22;             // 자식 타입

            Action <Level2> a22 = Program.Act;               // 같은 타입
            //Action<Level1> a12 = Program.Act;             // 부모 타입, 에러
            Action <Level3> a32 = Program.Act;               // 자식 타입
        }
Пример #10
0
 public int CompareTo(IInvariant o)
 {
     return(value.CompareTo(((IntegerInvariant)o).value));
 }
Пример #11
0
 public static ValidationResult ToValidationResult <T>(this IInvariant <T> source) => new ValidationResult(source.Error);