@Test
  void and() {
    PersonCriteria other = PersonCriteria.person
            .and(person.age.atMost(1)).and(person.age.atLeast(2));

    assertExpressional(other, "call op=AND",
            "  call op=LESS_THAN_OR_EQUAL path=age constant=1",
            "  call op=GREATER_THAN_OR_EQUAL path=age constant=2");

    assertExpressional(other.and(person.age.is(3)),
            "call op=AND",
                    "  call op=LESS_THAN_OR_EQUAL path=age constant=1",
                    "  call op=GREATER_THAN_OR_EQUAL path=age constant=2",
                    "  call op=EQUAL path=age constant=3");

    assertExpressional(other.and(person.age.is(3)),
            "call op=AND",
                    "  call op=LESS_THAN_OR_EQUAL path=age constant=1",
                    "  call op=GREATER_THAN_OR_EQUAL path=age constant=2",
                    "  call op=EQUAL path=age constant=3");
  }
Tests that expression is built correctly by "serializing" it to string.
It is easier to debug expression when it is presented as human-readable tree
criteria/common/test/org/immutables/criteria/ExpressionAsStringTest.java