Пример #1
0
        public void Invalid_contract_tests()
        {
            var root = Syntax.ParseExpression("Contract.Requires(false);");
            var req  = new CodeContractCollector(ContractKind.Requires, Categories.SemanticCategories);

            req.Visit(root);

            Assert.AreEqual(0, req.Labels.Count, "Invalid requires contract should be skipped");
        }
Пример #2
0
        public void Three_clause_tests()
        {
            var root = Syntax.ParseExpression("Contract.Requires(x != null && (y != null && (z != null)));");
            var req  = new CodeContractCollector(ContractKind.Requires, Categories.SemanticCategories);

            req.Visit(root);

            Assert.AreEqual(3, req.Labels.Count(), "Expected categorization for all three clauses");
        }
Пример #3
0
        public void Top_level_cojunct_and_enumerable_clauses_tests()
        {
            var root = Syntax.ParseExpression("Contract.Requires(y != null && Contract.ForAll(xs, x => x >= 0 && x < array.Length));");
            var req  = new CodeContractCollector(ContractKind.Requires, Categories.SemanticCategories);

            req.Visit(root);

            Assert.AreEqual(3, req.Labels.Count(), "Expected categorization for both top-level clauses");
        }
Пример #4
0
        public void Parenthesis_two_clause_tests()
        {
            var root = Syntax.ParseExpression("Contract.Requires((x != null && (y != null)));");
            var req  = new CodeContractCollector(ContractKind.Requires, Categories.SemanticCategories);

            req.Visit(root);

            Assert.AreEqual(2, req.Labels.Count(), "Expected categorization for both clauses");

            Assert.AreEqual(1, req.Labels[0].Labels.Count(), "Expected first clause to have a single label");
            Assert.AreEqual(1, req.Labels[1].Labels.Count(), "Expected second clause to have a single label");
        }
Пример #5
0
        public void Top_level_enumerable_clauses_tests()
        {
            var root = Syntax.ParseExpression("Contract.Requires(Contract.ForAll(xs, x => x >= 0 && x < array.Length));");
            var req  = new CodeContractCollector(ContractKind.Requires, Categories.SemanticCategories);

            req.Visit(root);

            Assert.AreEqual(2, req.Labels.Count(), "Expected categorization for both top-level clauses");

            Assert.AreEqual(1, req.Labels[0].Labels.Count(), "Expected first clause to have a single label");
            Assert.AreEqual(1, req.Labels[1].Labels.Count(), "Expected second clause to have a single label");
        }
Пример #6
0
        public void CheckContractIsOther(string contract, ContractKind kind)
        {
            var root = Syntax.ParseExpression(contract);
            var req  = new CodeContractCollector(kind, Categories.SemanticCategories);

            req.Visit(root);

            Assert.IsTrue(req.Labels.Count == 1, "Expected a single contract clause for contract {0}", contract);
            Assert.IsFalse(
                req.Labels[0].Labels.Any(),
                string.Format("Contract '{0}' miscategorized. Label(s): {1}",
                              contract,
                              string.Join(",", req.Labels[0].Labels)));
        }
Пример #7
0
        public void CheckContract(string contract, ContractKind kind, Category expected)
        {
            var root      = Syntax.ParseExpression(contract);
            var collector = new CodeContractCollector(kind, Categories.SemanticCategories);

            collector.Visit(root);

            Assert.AreEqual(1, collector.Labels.Count, "Expected a single top-level contract clause");

            var labels = collector.Labels[0].Labels.ToList();

            Assert.IsTrue(labels.Count > 0, string.Format("Contract {0} not labeled", contract));
            Assert.AreEqual(1, labels.Count, "Expected a single label for the contract");
            Assert.AreEqual(expected.Name, labels[0], string.Format("Contract {0} miscategorized", contract));
        }
Пример #8
0
        public void Combined_bounds_check_test()
        {
            // This test fails because the categorization is considering each top-level clause separately
            var root = Syntax.ParseExpression("Contract.Requires(idx >= 0 && idx < array.Length);");
            var req  = new CodeContractCollector(ContractKind.Requires, Categories.SemanticCategories);

            req.Visit(root);

            Assert.AreEqual(2, req.Labels.Count(), "Expected categorization for both clauses");

            Assert.AreEqual(1, req.Labels[0].Labels.Count(), "Expected first clause to have a single label");
            Assert.AreEqual(1, req.Labels[1].Labels.Count(), "Expected second clause to have a single label");

            Assert.AreEqual(Categories.BoundsCheck.Name, req.Labels[0].Labels.First());
            Assert.AreEqual(Categories.BoundsCheck.Name, req.Labels[1].Labels.First());
        }