@Test
  void string() {
    assertExpressional(person.bestFriend.isPresent(), "call op=IS_PRESENT path=bestFriend");
    assertExpressional(person.bestFriend.isAbsent(), "call op=IS_ABSENT path=bestFriend");

    assertExpressional(person.bestFriend.value().hobby.is("ski"),
            "call op=EQUAL path=bestFriend.hobby constant=ski");
    assertExpressional(person.fullName.in("n1", "n2"), "call op=IN path=fullName constant=[n1, n2]");

    assertExpressional(person.fullName.is("John").or().fullName.is("Mary"),
            "call op=OR",
                    "  call op=EQUAL path=fullName constant=John",
                    "  call op=EQUAL path=fullName constant=Mary");

    assertExpressional(person.fullName.is("John").or().fullName.is("Mary").or().fullName.is("Bob"),
            "call op=OR",
                    "  call op=EQUAL path=fullName constant=John",
                    "  call op=EQUAL path=fullName constant=Mary",
                    "  call op=EQUAL path=fullName constant=Bob");

    assertExpressional(person.bestFriend.value().hobby.is("ski"),
                    "call op=EQUAL path=bestFriend.hobby constant=ski");
  }
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