If you’re familiar with building expressions, buidling predications without using the Expressif language is similar. To achive this, use the class PredicationBuilder. The first predicate can be specified with the help of the Chain method.
var builder = new PredicationBuilder().Create<StartsWith>("Nik");
var predicate = builder.Build();
Assert.That(predicate.Evaluate("Nikola Tesla"), Is.True);
You can specify the combinational operator between two predicates with the help of the And, Or, Xor methods.
var builder = new PredicationBuilder()
.Create<StartsWith>("ola")
.Or<EndsWith>("sla")
.And<SortedAfter>("Alan Turing")
.Xor<SortedBefore>("Marie Curie");
var predicate = builder.Build();
Assert.That(predicate.Evaluate("Nikola Tesla"), Is.True);
To negate a predicate, you must use the AndNot, OrNot or XorNot methods from the builder class.
var builder = new PredicationBuilder()
.Create<StartsWith>("ola")
.OrNot<EndsWith>("Tes");
var predicate = builder.Build();
Assert.That(predicate.Evaluate("Nikola Tesla"), Is.True);
Any subpredication is automatically assigned as group. The serialization is illustrating this behaviour
var subPredicate = new PredicationBuilder()
.Create<StartsWith>("Nik")
.And<EndsWith>("sla");
var builder = new PredicationBuilder()
.Create<LowerCase>()
.Or(subPredicate)
.Or<UpperCase>();
var str = builder.Serialize();
Assert.That(str, Is.EqualTo(" |OR upper-case}"));