Пример #1
0
        /// <summary>
        /// Get an element from the set.
        /// </summary>
        /// <returns>An element if non-empty.</returns>
        public T Element()
        {
            var model = this.Solver.Satisfiable(this.Set);

            if (!model.HasValue)
            {
                throw new ZenException("No element exists in state set.");
            }

            var assignment = new Dictionary <object, object>();

            foreach (var kv in this.ArbitraryMapping)
            {
                var value = this.Solver.Get(model.Value, kv.Value);
                assignment[kv.Key] = value;
            }

            var interpreterEnv = new ExpressionEvaluatorEnvironment(assignment);

            return(CommonUtilities.ConvertSymbolicResultToCSharp <T>(this.ZenExpression.Accept(new ExpressionEvaluator(false), interpreterEnv)));
        }
Пример #2
0
        /// <summary>
        /// Get an element from the set.
        /// </summary>
        /// <returns>An element if non-empty.</returns>
        public Option <T> Element()
        {
            var model = this.Solver.Satisfiable(this.Set);

            if (!model.HasValue)
            {
                return(Option.None <T>());
            }

            var assignment = new Dictionary <object, object>();

            foreach (var kv in this.ArbitraryMapping)
            {
                var value = this.Solver.Get(model.Value, kv.Value);
                assignment[kv.Key] = value;
            }

            var interpreterEnv = new ExpressionEvaluatorEnvironment(assignment);
            var result         = CommonUtilities.ConvertSymbolicResultToCSharp <T>(this.ZenExpression.Accept(new ExpressionEvaluator(false), interpreterEnv));

            return(Option.Some(result));
        }
Пример #3
0
        /// <summary>
        /// Generate inputs that exercise different program paths.
        /// </summary>
        /// <param name="function">The function.</param>
        /// <param name="precondition">A precondition.</param>
        /// <param name="input">The symbolic input.</param>
        /// <param name="backend">The backend to use.</param>
        /// <returns>A collection of inputs.</returns>
        public static IEnumerable <T1> GenerateInputs <T1, T2>(
            Func <Zen <T1>, Zen <T2> > function,
            Func <Zen <T1>, Zen <bool> > precondition,
            Zen <T1> input,
            Backend backend)
        {
            var expression = function(input).Simplify();
            var assume     = precondition(input).Simplify();

            (T2, PathConstraint) interpretFunction(T1 e)
            {
                var assignment = ModelCheckerFactory.CreateModelChecker(backend, null).ModelCheck(input == e);
                var evaluator  = new ExpressionEvaluator(true);
                var env        = new ExpressionEvaluatorEnvironment(assignment);

                return((T2)expression.Accept(evaluator, env), evaluator.PathConstraint);
            }

            Option <T1> findFunction(Zen <bool> e) => SymbolicEvaluator.Find(e, input, backend);

            return(GenerateInputsSage(assume, findFunction, interpretFunction));
        }