Example #1
0
 public void NullableSbyteToBeLessThanOrEqualToFailed()
 {
     Given(() => (sbyte?)42)
     .When(value => Ensures.ToBeLessThanOrEqualTo(value, (sbyte)1))
     .ThenThrow <ArgumentException>();
 }
Example #2
0
 public void NullableSbyteToBeLessThanFailedWithCustomException()
 {
     Given(() => (sbyte?)42)
     .When(value => Ensures.ToBeLessThan(value, (sbyte)1, () => new ArgumentOutOfRangeException()))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #3
0
 public void NullableSbyteToBeLessThanFailedWithParameterizedException()
 {
     Given(() => (sbyte?)42)
     .When(value => Ensures.ToBeLessThan(value, (sbyte)1, (v, max) => new ArgumentOutOfRangeException($"Invalid value: {v} >= {max}")))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #4
0
 public void NullableSbyteToBeGreaterThanSuccessful()
 {
     Given(() => (sbyte?)42)
     .When(value => Ensures.ToBeGreaterThan(value, (sbyte)1))
     .Then(value => value.Should().Be(42));
 }
Example #5
0
 public void NullableSbyteToBeGreaterThanOrEqualToFailedWithCustomException()
 {
     Given(() => (sbyte?)42)
     .When(value => Ensures.ToBeGreaterThanOrEqualTo(value, (sbyte)100, () => new ArgumentOutOfRangeException()))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
 internal void CheckPostcondition(Ensures ens)
 {
     if (ens == null) return;
     this.Current = ens;
     this.Visit(ens);
 }
Example #7
0
 public void ByteToBeGreaterThanSuccessful()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeGreaterThan(value, (byte)1))
     .Then(value => value.Should().Be((byte)42));
 }
Example #8
0
 public void ByteToBeLessThanOrEqualToFailedWithCustomException()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeLessThanOrEqualTo(value, (byte)1, () => new ArgumentOutOfRangeException()))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #9
0
 public void ByteToBeLessThanOrEqualToFailedWithParameterizedException()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeLessThanOrEqualTo(value, (byte)1, (v, max) => new ArgumentOutOfRangeException($"Invalid value: {v} > {max}")))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #10
0
 public void ByteToBeSuccessful()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBe(value, v => v == (byte)42))
     .Then(value => value.Should().Be((byte)42));
 }
Example #11
0
 public void ByteToBeLessThanOrEqualToSuccessful()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeLessThanOrEqualTo(value, (byte)100))
     .Then(value => value.Should().Be((byte)42));
 }
Example #12
0
 public void ByteToBeGreaterThanFailedWithParameterizedException()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeGreaterThan(value, (byte)100, (v, min) => new ArgumentOutOfRangeException($"Invalid value: {v} <= {min}")))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #13
0
        private void CreateFailurePreservationChecker(AtomicAction first, AtomicAction second)
        {
            if (!first.gateUsedGlobalVars.Intersect(second.modifiedGlobalVars).Any())
            {
                return;
            }
            if (!failurePreservationCheckerCache.Add(Tuple.Create(first, second)))
            {
                return;
            }

            HashSet <Variable> frame = new HashSet <Variable>();

            frame.UnionWith(first.gateUsedGlobalVars);
            frame.UnionWith(second.gateUsedGlobalVars);
            frame.UnionWith(second.actionUsedGlobalVars);

            List <Requires> requires = new List <Requires>
            {
                DisjointnessRequires(first.firstImpl.InParams.Union(second.secondImpl.InParams).Where(v => linearTypeChecker.FindLinearKind(v) != LinearKind.LINEAR_OUT), frame)
            };
            Expr firstNegatedGate = Expr.Not(Expr.And(first.firstGate.Select(a => a.Expr)));

            firstNegatedGate.Type = Type.Bool; // necessary?
            requires.Add(new Requires(false, firstNegatedGate));
            foreach (AssertCmd assertCmd in second.secondGate)
            {
                requires.Add(new Requires(false, assertCmd.Expr));
            }

            IEnumerable <Expr> linearityAssumes = DisjointnessExpr(first.firstImpl.InParams.Union(second.secondImpl.OutParams), frame);
            Ensures            ensureCheck      = new Ensures(first.proc.tok, false, Expr.Imp(Expr.And(linearityAssumes), firstNegatedGate), null)
            {
                ErrorData = $"Gate failure of {first.proc.Name} not preserved by {second.proc.Name}"
            };
            List <Ensures> ensures = new List <Ensures> {
                ensureCheck
            };

            string checkerName = $"FailurePreservationChecker_{first.proc.Name}_{second.proc.Name}";

            List <Variable> inputs  = Enumerable.Union(first.firstImpl.InParams, second.secondImpl.InParams).ToList();
            List <Variable> outputs = Enumerable.Union(first.firstImpl.OutParams, second.secondImpl.OutParams).ToList();
            var             block   = new Block(Token.NoToken, "init",
                                                new List <Cmd>
            {
                new CallCmd(Token.NoToken,
                            second.proc.Name,
                            second.secondImpl.InParams.Select(Expr.Ident).ToList <Expr>(),
                            second.secondImpl.OutParams.Select(Expr.Ident).ToList()
                            )
                {
                    Proc = second.proc
                }
            },
                                                new ReturnCmd(Token.NoToken));

            AddChecker(checkerName, inputs, outputs, new List <Variable>(), requires, ensures, new List <Block> {
                block
            });
        }
Example #14
0
        private void CreateCommutativityChecker(AtomicAction first, AtomicAction second)
        {
            if (first == second && first.firstImpl.InParams.Count == 0 && first.firstImpl.OutParams.Count == 0)
            {
                return;
            }
            if (first.TriviallyCommutesWith(second))
            {
                return;
            }
            if (!commutativityCheckerCache.Add(Tuple.Create(first, second)))
            {
                return;
            }

            string checkerName = $"CommutativityChecker_{first.proc.Name}_{second.proc.Name}";

            HashSet <Variable> frame = new HashSet <Variable>();

            frame.UnionWith(first.gateUsedGlobalVars);
            frame.UnionWith(first.actionUsedGlobalVars);
            frame.UnionWith(second.gateUsedGlobalVars);
            frame.UnionWith(second.actionUsedGlobalVars);

            List <Requires> requires = new List <Requires> {
                DisjointnessRequires(
                    first.firstImpl.InParams.
                    Union(second.secondImpl.InParams).
                    Where(v => linearTypeChecker.FindLinearKind(v) != LinearKind.LINEAR_OUT),
                    frame)
            };

            foreach (AssertCmd assertCmd in Enumerable.Union(first.firstGate, second.secondGate))
            {
                requires.Add(new Requires(false, assertCmd.Expr));
            }

            var witnesses          = civlTypeChecker.commutativityHints.GetWitnesses(first, second);
            var transitionRelation = TransitionRelationComputation.
                                     Commutativity(second, first, frame, witnesses);

            List <Cmd> cmds = new List <Cmd>
            {
                new CallCmd(Token.NoToken,
                            first.proc.Name,
                            first.firstImpl.InParams.Select(Expr.Ident).ToList <Expr>(),
                            first.firstImpl.OutParams.Select(Expr.Ident).ToList()
                            )
                {
                    Proc = first.proc
                },
                new CallCmd(Token.NoToken,
                            second.proc.Name,
                            second.secondImpl.InParams.Select(Expr.Ident).ToList <Expr>(),
                            second.secondImpl.OutParams.Select(Expr.Ident).ToList()
                            )
                {
                    Proc = second.proc
                }
            };

            foreach (var lemma in civlTypeChecker.commutativityHints.GetLemmas(first, second))
            {
                cmds.Add(CmdHelper.AssumeCmd(ExprHelper.FunctionCall(lemma.function, lemma.args.ToArray())));
            }
            var block = new Block(Token.NoToken, "init", cmds, new ReturnCmd(Token.NoToken));

            var secondInParamsFiltered          = second.secondImpl.InParams.Where(v => linearTypeChecker.FindLinearKind(v) != LinearKind.LINEAR_IN);
            IEnumerable <Expr> linearityAssumes = Enumerable.Union(
                DisjointnessExpr(first.firstImpl.OutParams.Union(secondInParamsFiltered), frame),
                DisjointnessExpr(first.firstImpl.OutParams.Union(second.secondImpl.OutParams), frame));
            // TODO: add further disjointness expressions?
            Ensures ensureCheck = new Ensures(first.proc.tok, false, Expr.Imp(Expr.And(linearityAssumes), transitionRelation), null)
            {
                ErrorData = $"Commutativity check between {first.proc.Name} and {second.proc.Name} failed"
            };
            List <Ensures> ensures = new List <Ensures> {
                ensureCheck
            };

            List <Variable> inputs  = Enumerable.Union(first.firstImpl.InParams, second.secondImpl.InParams).ToList();
            List <Variable> outputs = Enumerable.Union(first.firstImpl.OutParams, second.secondImpl.OutParams).ToList();

            AddChecker(checkerName, inputs, outputs, new List <Variable>(), requires, ensures, new List <Block> {
                block
            });
        }
Example #15
0
    private bool EmitEnsures(Ensures postcondition, TypeNode referencingType, bool skipQuantifiers) {
      if (CodeInspector.IsRuntimeIgnored(postcondition, this.runtimeContracts.ContractNodes, referencingType, skipQuantifiers)) return false;

      return this.Emit(RuntimeContractEmitFlags.Ensures);
    }
Example #16
0
 public void ByteToBeFailed()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBe(value, v => v != (byte)42))
     .ThenThrow <ArgumentException>();
 }
Example #17
0
		public virtual Ensures VisitEnsures (Ensures node)
		{
			if (node == null)
				return null;

			node.Assertion = VisitExpression (node.Assertion);
			node.UserMessage = VisitExpression (node.UserMessage);

			return node;
		}
Example #18
0
 public void ByteToBeOneOfSuccessful()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeOneOf(value, new[] { (byte)1, (byte)2, (byte)42 }))
     .Then(value => value.Should().Be((byte)42));
 }
Example #19
0
 public static IValidateValue <T> EnsuresReturnValue <T>(T value, [CallerMemberName] string methodName = null)
 {
     return(Ensures.ReturnValue(value, methodName));
 }
Example #20
0
 public void ByteToBeOneOfFailed()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeOneOf(value, new[] { (byte)1, (byte)2 }))
     .ThenThrow <ArgumentException>();
 }
Example #21
0
 public void ByteToBeGreaterThanFailed()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeGreaterThan(value, (byte)100))
     .ThenThrow <ArgumentException>();
 }
Example #22
0
 public void ByteToBeOneOfFailedWithCustomException()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeOneOf(value, new[] { (byte)1, (byte)2 }, () => new ArgumentOutOfRangeException()))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #23
0
 public void NullableSbyteToBeGreaterThanOrEqualToNullFailed()
 {
     Given(() => (sbyte?)null)
     .When(value => Ensures.ToBeGreaterThanOrEqualTo(value, (sbyte)100))
     .ThenThrow <ArgumentException>();
 }
Example #24
0
 public void ByteToBeOneOfFailedWithParameterizedException()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeOneOf(value, new[] { (byte)1, (byte)2 }, (v, others) => new ArgumentOutOfRangeException($"Invalid value: {v}")))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #25
0
 public void NullableSbyteToBeGreaterThanOrEqualToFailedWithParameterizedException()
 {
     Given(() => (sbyte?)42)
     .When(value => Ensures.ToBeGreaterThanOrEqualTo(value, (sbyte)100, (v, min) => new ArgumentOutOfRangeException($"Invalid value: {v} < {min}")))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #26
0
 public void ByteToBeFailedWithCustomException()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBe(value, v => v != (byte)42, () => new ArgumentOutOfRangeException()))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #27
0
 public void NullableSbyteToBeNullSuccessful()
 {
     Given(() => (sbyte?)null)
     .When(value => Ensures.ToBe(value, v => v == null))
     .Then(value => value.Should().Be(null));
 }
Example #28
0
 public void ByteToBeFailedWithParameterizedException()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBe(value, v => v != (byte)42, v => new ArgumentOutOfRangeException($"Invalid value: {v}")))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #29
0
 public void NullableSbyteToBeLessThanOrEqualToSuccessful()
 {
     Given(() => (sbyte?)42)
     .When(value => Ensures.ToBeLessThanOrEqualTo(value, (sbyte)100))
     .Then(value => value.Should().Be(42));
 }
Example #30
0
 public void ByteToBeBetweenSuccessful()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeBetween(value, (byte)1, (byte)100))
     .Then(value => value.Should().Be((byte)42));
 }
Example #31
0
        private ReplaceResult ReplaceResult(Method method, Local result, Ensures e)
        {
            ReplaceResult repResult = new ReplaceResult(method, result, this.assemblyBeingRewritten);
            repResult.Visit(e);

            if (repResult.ContractResultWasCapturedInStaticContext)
            {
                this.HandleError(CreateContractResultWasCapturedInStaticContextWarning(e.Assertion.SourceContext));
            }

            return repResult;
        }
Example #32
0
 public void ByteToBeBetweenFailed()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeBetween(value, (byte)100, (byte)1))
     .ThenThrow <ArgumentException>();
 }
Example #33
0
		public virtual void VisitEnsures (Ensures node)
		{
			if (node == null)
				return;

			VisitExpression (node.Assertion);
			VisitExpression (node.UserMessage);
		}
Example #34
0
 public void ByteToBeBetweenFailedWithCustomException()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeBetween(value, (byte)100, (byte)1, () => new ArgumentOutOfRangeException()))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
Example #35
0
            public static void Transform(ExtractorVisitor parent, Property autoProp, Invariant invariant,
                out Requires req, out Ensures ens)
            {
                var makeReq = new ChangePropertyInvariantIntoRequiresEnsures(parent, autoProp);
                req = makeReq.MakeRequires(invariant.Condition);

                var makeEns = new ChangePropertyInvariantIntoRequiresEnsures(parent, autoProp);
                ens = makeEns.MakeEnsures(invariant.Condition);

                ens.SourceContext = invariant.SourceContext;
                ens.PostCondition.SourceContext = ens.SourceContext;
                ens.ILOffset = invariant.ILOffset;

                if (ens.SourceConditionText == null)
                {
                    ens.SourceConditionText = invariant.SourceConditionText;
                }

                req.SourceContext = invariant.SourceContext;
                req.Condition.SourceContext = req.SourceContext;
                req.ILOffset = invariant.ILOffset;

                if (req.SourceConditionText == null)
                {
                    req.SourceConditionText = invariant.SourceConditionText;
                }
            }
Example #36
0
 public void ByteToBeBetweenFailedWithParameterizedException()
 {
     Given(() => (byte)42)
     .When(value => Ensures.ToBeBetween(value, (byte)100, (byte)1, (v, min, max) => new ArgumentOutOfRangeException($"Invalid value: {v} not between {min} and {max}")))
     .ThenThrow <ArgumentOutOfRangeException>();
 }
            private void CheckEnsures(Method method, Ensures ensures)
            {
                // F:
                Contract.Requires(method != null);

                Contract.Requires(ensures != null);

                CheckEnsuresExceptional(method, ensures as EnsuresExceptional);

                var nonVisible = this.visibilityHelper.AsVisibleAs(ensures.PostCondition, method);
                if (nonVisible != null)
                {
                    string message = "Member '" + nonVisible.FullName +
                                     "' has less visibility than the enclosing method '"
                                     + method.FullName + "'.";
                    this.HandleError(method, 1038, message, ensures);
                }
            }
Example #38
0
        /// <summary>
        /// Processes operation contract statement node.
        /// </summary>
        /// <param name="node">The node.</param>
        private void Process_OperationContractStatement(dynamic node)
        {
            if (node.GetBrand() == "Ensures")
            {
                Ensures ensures = new Ensures();

                // Map source location and node to object
                ensures.AddMetaInfo(new SourceLocationInfo(node, context));
                context.AddObject(node, ensures);

                // OperationContract
                ensures.OperationContract = (OperationContract)NameContext.Current.Scope;

                // Text
                ensures.Text = node.Text;

                // Rule
                ensures.Rule = this.Process(node.Rule);
                ensures.Rule.ExpectedType = BuiltInType.Bool;
            }
            if (node.GetBrand() == "Requires")
            {
                Requires requires = new Requires();

                // Map source location and node to object
                requires.AddMetaInfo(new SourceLocationInfo(node, context));
                context.AddObject(node, requires);

                // OperationContract
                requires.OperationContract = (OperationContract)NameContext.Current.Scope;

                // Text
                requires.Text = node.Text;

                // Rule
                requires.Rule = this.Process(node.Rule);
                requires.Rule.ExpectedType = BuiltInType.Bool;

                // Otherwise
                requires.Otherwise = this.Process(node.Otherwise);
                requires.Otherwise.ExpectedType = PseudoType.Object;
            }
        }