@Test
 public void testNulls() {
   Expression e1 = ExpressionFactory.exp("x = null");
   Expression e2 = e1.params(Collections.EMPTY_MAP, true);
   assertNotNull(e2);
   TstTraversalHandler.compareExps(e1, e2);
 }
  /** Tests how parameter substitution algorithm works on an expression with no parameters. */
  @Test
  public void testCopy1() throws Exception {
    Expression e1 = ExpressionFactory.matchExp("k1", "v1");
    e1 = e1.orExp(ExpressionFactory.matchExp("k2", "v2"));
    e1 = e1.orExp(ExpressionFactory.matchExp("k3", "v3"));

    Expression e2 = e1.params(new HashMap());

    TstTraversalHandler.compareExps(e1, e2);
  }
  /** Tests how parameter substitution algorithm works on an expression with no parameters. */
  @Test
  public void testCopy2() throws Exception {
    Expression andExp = ExpressionFactory.matchExp("k1", "v1");
    andExp = andExp.andExp(ExpressionFactory.matchExp("k2", "v2"));
    andExp = andExp.andExp(ExpressionFactory.matchExp("k3", "v3"));

    List exprs = new ArrayList();
    exprs.add(andExp);
    exprs.add(ExpressionFactory.matchExp("k1", "v1"));

    Expression e1 = ExpressionFactory.joinExp(Expression.OR, exprs);
    Expression e2 = e1.params(new HashMap());

    TstTraversalHandler.compareExps(e1, e2);
  }
  /** Tests how parameter substitution algorithm works on an expression with no parameters. */
  @Test
  public void testInParameter() throws Exception {
    Expression inExp = ExpressionFactory.exp("k1 in $test");
    Expression e1 = ExpressionFactory.exp("k1 in ('a', 'b')");

    Expression transformed =
        inExp.params(Collections.singletonMap("test", new Object[] {"a", "b"}));
    TstTraversalHandler.compareExps(e1, transformed);

    // just in case manually check params
    DataObject o1 = new CayenneDataObject();
    o1.writePropertyDirectly("k1", "a");
    assertTrue(transformed.match(o1));

    DataObject o2 = new CayenneDataObject();
    o2.writePropertyDirectly("k1", "x");
    assertFalse(transformed.match(o2));
  }
  @Test
  public void testInParameter_AsValues() throws Exception {
    Expression inExp = ExpressionFactory.exp("k1 in ($ap, $bp)");

    String e1String = "k1 in (\"a\", \"b\")";
    Expression e1 = ExpressionFactory.exp(e1String);

    Map<String, Object> params = new HashMap<String, Object>();
    params.put("ap", "a");
    params.put("bp", "b");
    Expression transformed = inExp.params(params);
    TstTraversalHandler.compareExps(e1, transformed);

    assertEquals(e1String, transformed.toString());

    // just in case manually check params
    DataObject o1 = new CayenneDataObject();
    o1.writePropertyDirectly("k1", "a");
    assertTrue(transformed.match(o1));

    DataObject o2 = new CayenneDataObject();
    o2.writePropertyDirectly("k1", "x");
    assertFalse(transformed.match(o2));
  }
 @Test
 public void testCopy3_FromString() {
   Expression e1 = ExpressionFactory.exp("(k1 / 2) = (k2 * 2)");
   Expression e2 = e1.params(Collections.EMPTY_MAP);
   TstTraversalHandler.compareExps(e1, e2);
 }
 /** Tests how parameter substitution algorithm works on an expression with no parameters. */
 @Test
 public void testCopy2_FromString() {
   Expression e1 = ExpressionFactory.exp("(k1 = 'v1' and k2 = 'v2' and k3 = 'v3') or (k1 = 'v1')");
   Expression e2 = e1.params(Collections.EMPTY_MAP);
   TstTraversalHandler.compareExps(e1, e2);
 }