public void DisjoinsCriteria()
        {
            var spec1 = new IntegerPredicate(i => i == 0);
            var spec2 = new IntegerPredicate(i => i > 0);

            var criteria1 = spec1.Criteria;
            var criteria2 = spec2.Criteria;

            var disjoinedSpec = new ExclusiveDisjunction<int>(spec1, spec2);
            var disjoinedCriteria = disjoinedSpec.Criteria;

            Assert.That(disjoinedCriteria.Body, Is.AssignableTo<BinaryExpression>());

            var binary = (BinaryExpression)disjoinedCriteria.Body;

            Assert.That(binary.NodeType, Is.EqualTo(ExpressionType.ExclusiveOr));
            Assert.That(binary.Conversion, Is.Null);
            Assert.That(binary.Left.ToString(), Is.EqualTo(criteria1.Body.ToString()));
            Assert.That(binary.Right.ToString(), Is.EqualTo(criteria2.Body.ToString()));
            Assert.That(binary.Method, Is.Null);
            Assert.That(binary.IsLifted, Is.False);
            Assert.That(binary.IsLiftedToNull, Is.False);

            ExpressionWriter.Write(disjoinedCriteria);
        }
 public void SetUp()
 {
     _lowerValue = int.MinValue + 1;
     _upperValue = int.MaxValue - 1;
     _rows       = new List <Row>();
     _column     = new ColumnBuilder().Build();
     _predicate  = new IntegerPredicate();
 }
        public void SelectsExclusiveDisjunction()
        {
            var spec1 = new IntegerPredicate(i => i > 1);
            var spec2 = new IntegerPredicate(i => i > 0);
            var disjoinedSpec = new ExclusiveDisjunction<int>(spec1, spec2);

            Assert.That(disjoinedSpec.IsSatisfiedBy(2), Is.False);
            Assert.That(disjoinedSpec.IsSatisfiedBy(1), Is.True);
            Assert.That(disjoinedSpec.IsSatisfiedBy(-1), Is.False);
        }
Exemplo n.º 4
0
        public void SelectsConjunction()
        {
            var spec1 = new IntegerGreaterThanZero();
            var spec2 = new IntegerPredicate(i => i > -1);
            var conjoinedSpec = new Conjunction<int>(spec1, spec2);

            Assert.That(conjoinedSpec.IsSatisfiedBy(1), Is.True);
            Assert.That(conjoinedSpec.IsSatisfiedBy(0), Is.False);
            Assert.That(conjoinedSpec.IsSatisfiedBy(-1), Is.False);
        }
Exemplo n.º 5
0
        public void NegatesCriteria()
        {
            var spec = new IntegerPredicate(i => i == 0);
            var criteria = spec.Criteria;
            var negatedSpec = new Negation<int>(spec);
            var negatedCriteria = negatedSpec.Criteria;

            Assert.That(negatedCriteria.Body, Is.TypeOf<UnaryExpression>());

            var unary = (UnaryExpression)negatedCriteria.Body;

            Assert.That(unary.NodeType, Is.EqualTo(ExpressionType.Not));
            Assert.That(unary.Operand, Is.EqualTo(criteria.Body));
            Assert.That(unary.Method, Is.Null);
            Assert.That(unary.IsLifted, Is.False);
            Assert.That(unary.IsLiftedToNull, Is.False);

            ExpressionWriter.Write(negatedCriteria);
        }
Exemplo n.º 6
0
        private void InstallLocalPredicates()
        {
            // Input/Output
            _predicates["write/1"]   = new WritePredicate();
            _predicates["writeln/1"] = new WriteLnPredicate();
            _predicates["nl/0"]      = new NlPredicate();
            _predicates["get0/1"]    = new Get0Predicate();
            _predicates["skip/1"]    = new SkipPredicate();
            _predicates["put/1"]     = new PutPredicate();

            // Comparison, numeric
            _predicates["=\\=/2"] = new NotEqualsPredicate();
            _predicates["=:=/2"]  = new EqualsPredicate();
            _predicates[">=/2"]   = new GreaterThanEqualPredicate();
            _predicates[">/2"]    = new GreaterThanPredicate();
            _predicates["=</2"]   = new LessThanEqualPredicate();
            _predicates["</2"]    = new LessThanPredicate();

            // Control
            _predicates["call/1"] = new CallPredicate();

            // Equality
            _predicates["=/2"]   = new UnifyPredicate();
            _predicates["\\=/2"] = new NotUnifiablePredicate();

            // Meta
            _predicates["is/2"]      = new IsPredicate();
            _predicates["atom/1"]    = new AtomPredicate();
            _predicates["bound/1"]   = new BoundPredicate();
            _predicates["char/1"]    = new CharPredicate();
            _predicates["free/1"]    = new FreePredicate();
            _predicates["integer/1"] = new IntegerPredicate();
            _predicates["nonvar/1"]  = new NonVarPredicate();
            _predicates["var/1"]     = new VarPredicate();

            // Object-Oriented Programming
            _predicates["object/2"]       = new object_2();
            _predicates["invoke/3"]       = new invoke_2();
            _predicates["get_property/3"] = new get_property_3();

            // .NET Reflection
        }
        public void ExistentiallyQuantifiesCriteria()
        {
            var spec = new IntegerPredicate(i => i == 0);
            var criteria = spec.Criteria;

            var anySpec = new ExistentialQuantification<int>(spec);
            var anyCriteria = anySpec.Criteria;

            Assert.That(anyCriteria.Body, Is.AssignableTo<MethodCallExpression>());

            var call = (MethodCallExpression)anyCriteria.Body;

            Assert.That(call.NodeType, Is.EqualTo(ExpressionType.Call));
            Assert.That(call.Method, Is.EqualTo(typeof(Enumerable).GetMethods().Where(m => m.Name == "Any").ToArray()[1].MakeGenericMethod(new[] { typeof(int) })));
            Assert.That(call.Object, Is.Null);
            Assert.That(call.Arguments, Has.Count.EqualTo(2));
            Assert.That(call.Arguments[0], Is.AssignableTo<ParameterExpression>());
            Assert.That(call.Arguments[1], Is.EqualTo(criteria));

            ExpressionWriter.Write(anyCriteria);
        }
        public void UniversallyQuantifiesCriteria()
        {
            var spec = new IntegerPredicate(i => i == 0);
            var criteria = spec.Criteria;

            var allSpec = new UniversalQuantification<int>(spec);
            var allCriteria = allSpec.Criteria;

            Assert.That(allCriteria.Body, Is.AssignableTo<MethodCallExpression>());

            var call = (MethodCallExpression)allCriteria.Body;

            Assert.That(call.NodeType, Is.EqualTo(ExpressionType.Call));
            Assert.That(call.Method, Is.EqualTo(typeof(Enumerable).GetMethod("All").MakeGenericMethod(new[] { typeof(int) })));
            Assert.That(call.Object, Is.Null);
            Assert.That(call.Arguments, Has.Count.EqualTo(2));
            Assert.That(call.Arguments[0], Is.AssignableTo<ParameterExpression>());
            Assert.That(call.Arguments[1], Is.EqualTo(criteria));

            ExpressionWriter.Write(allCriteria);
        }
Exemplo n.º 9
0
        public void Criteria()
        {
            var spec = new IntegerPredicate(i => i == 0);
            var criteria = spec.Criteria;

            var proposition = new Proposition<int>(criteria);
            var proposedCriteria = proposition.Criteria;

            Assert.That(proposedCriteria.Body, Is.AssignableTo<BinaryExpression>());

            var binary = (BinaryExpression)proposedCriteria.Body;

            Assert.That(binary.NodeType, Is.EqualTo(ExpressionType.Equal));
            Assert.That(binary.Method, Is.Null);
            Assert.That(binary.IsLifted, Is.False);
            Assert.That(binary.IsLiftedToNull, Is.False);
            Assert.That(binary.Conversion, Is.Null);
            Assert.That(binary.Left, Is.AssignableTo<ParameterExpression>());
            Assert.That(binary.Right, Is.TypeOf<ConstantExpression>().With.Property("Value").EqualTo(0));

            ExpressionWriter.Write(proposedCriteria);
        }
Exemplo n.º 10
0
        public void ConvertsCriteria()
        {
            var spec = new IntegerPredicate(i => i == 0);
            var converter = (Expression<Func<double, int>>)(d => Math.Sign(d));
            var criteria = spec.Criteria;
            var convertedSpec = new Conversion<double, int>(spec, converter);
            var convertedCriteria = convertedSpec.Criteria;

            Assert.That(convertedCriteria.Body, Is.AssignableTo<BinaryExpression>());

            var binary = (BinaryExpression)convertedCriteria.Body;

            Assert.That(binary.NodeType, Is.EqualTo(ExpressionType.Equal));
            Assert.That(binary.Left, Is.EqualTo(converter.Body));
            Assert.That(binary.Right, Is.EqualTo(((BinaryExpression)criteria.Body).Right));
            Assert.That(binary.Method, Is.Null);
            Assert.That(binary.IsLifted, Is.False);
            Assert.That(binary.IsLiftedToNull, Is.False);
            Assert.That(binary.Conversion, Is.Null);

            ExpressionWriter.Write(convertedCriteria);
        }
        public void UniquelyQuantifiesCriteria()
        {
            var spec = new IntegerPredicate(i => i == 0);
            var criteria = spec.Criteria;

            var singleSpec = new UniqueQuantification<int>(spec);
            var singleCriteria = singleSpec.Criteria;

            Assert.That(singleCriteria.Body, Is.AssignableTo<BinaryExpression>());

            var binary = (BinaryExpression)singleCriteria.Body;

            Assert.That(binary.Conversion, Is.Null);
            Assert.That(binary.IsLifted, Is.False);
            Assert.That(binary.IsLiftedToNull, Is.False);
            Assert.That(binary.Method, Is.Null);
            Assert.That(binary.NodeType, Is.EqualTo(ExpressionType.Equal));
            Assert.That(binary.Type, Is.EqualTo(typeof(bool)));

            Assert.That(binary.Left, Is.AssignableTo<MethodCallExpression>());
            Assert.That(binary.Right, Is.TypeOf<ConstantExpression>());

            var call = (MethodCallExpression)binary.Left;
            var constant = (ConstantExpression)binary.Right;

            Assert.That(call.NodeType, Is.EqualTo(ExpressionType.Call));
            Assert.That(call.Method, Is.EqualTo(typeof(Enumerable).GetMethods().Where(m => m.Name == "Count").ToArray()[1].MakeGenericMethod(new[] { typeof(int) })));
            Assert.That(call.Object, Is.Null);
            Assert.That(call.Arguments, Has.Count.EqualTo(2));
            Assert.That(call.Arguments[0], Is.AssignableTo<ParameterExpression>());
            Assert.That(call.Arguments[1], Is.EqualTo(criteria));

            Assert.That(constant.Value, Is.EqualTo(1));

            ExpressionWriter.Write(singleCriteria);
        }