@Test
  public void testPrefixMacro() {
    CriteriaBuilder<Document> cb = cbf.create(em, Document.class, "d");
    cb.where("PREFIX(d, id)").eq(1L);
    String expected = "SELECT d FROM Document d WHERE d.id = :param_0";

    assertEquals(expected, cb.getQueryString());
    cb.getResultList();
  }
  @Test
  public void testScopedMacro() {
    CriteriaBuilder<Document> cb = cbf.create(em, Document.class, "d");
    CatchException.verifyException(cb, SyntaxErrorException.class).where("ID(d)");

    cb.registerMacro(
        "id",
        new JpqlMacro() {
          @Override
          public void render(FunctionRenderContext context) {
            context.addArgument(0);
            context.addChunk(".id");
          }
        });
    cb.where("ID(d)").eq(1);
    String expected = "SELECT d FROM Document d WHERE d.id = :param_0";
    assertEquals(expected, cb.getQueryString());

    CriteriaBuilder<Document> newCb = cbf.create(em, Document.class, "d");
    CatchException.verifyException(newCb, SyntaxErrorException.class).where("ID(d)");
  }
  @Test
  public void testSelectNewDocumentObjectBuilder() {
    CriteriaBuilder<String[]> criteria =
        cbf.create(em, Document.class, "d")
            .selectNew(
                new ObjectBuilder<String[]>() {

                  @Override
                  public <X extends SelectBuilder<X>> void applySelects(X queryBuilder) {
                    queryBuilder
                        .select("name", "name")
                        .select("UPPER(name)", "upperName")
                        .select("LOWER(name)", "lowerName")
                        .select("false");
                  }

                  @Override
                  public String[] build(Object[] tuple) {
                    return new String[] {(String) tuple[0], (String) tuple[1], (String) tuple[2]};
                  }

                  @Override
                  public List<String[]> buildList(List<String[]> list) {
                    return list;
                  }
                });
    assertEquals(
        "SELECT d.name AS name, UPPER(d.name) AS upperName, LOWER(d.name) AS lowerName, "
            + STATIC_JPA_PROVIDER.getBooleanExpression(false)
            + " FROM Document d",
        criteria.getQueryString());
    List<String[]> actual = criteria.getQuery().getResultList();

    assertArrayEquals(new String[] {"Doc1", "DOC1", "doc1"}, actual.get(0));
    assertArrayEquals(new String[] {"Doc2", "DOC2", "doc2"}, actual.get(1));
  }