package com.querydsl.jpa;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import com.querydsl.core.types.Operator;
import com.querydsl.core.types.Ops;
import com.querydsl.core.types.Templates;
import com.querydsl.core.types.TemplatesTestUtils;
public class JPQLTemplatesTest {
@Test
public void escape() {
List<Templates> templates = Arrays.<Templates>asList(
new JPQLTemplates(), new HQLTemplates(),
new EclipseLinkTemplates(), new OpenJPATemplates()
);
for (Templates t : templates) {
assertEquals("{0} like {1} escape '!'", t.getTemplate(Ops.LIKE).toString());
}
}
@Test
public void custom_escape() {
List<Templates> templates = Arrays.<Templates>asList(
new JPQLTemplates('X'), new HQLTemplates('X'),
new EclipseLinkTemplates('X'), new OpenJPATemplates('X')
);
for (Templates t : templates) {
assertEquals("{0} like {1} escape 'X'", t.getTemplate(Ops.LIKE).toString());
}
}
@Test
public void precedence() {
// Navigation operator (.)
// +, - unary *,
int p1 = getPrecedence(Ops.NEGATE);
// / multiplication and division
int p2 = getPrecedence(Ops.MULT, Ops.DIV);
// +, - addition and subtraction
int p3 = getPrecedence(Ops.ADD, Ops.SUB);
// Comparison operators : =, >, >=, <, <=, <> (not equal), [NOT] BETWEEN, [NOT] LIKE, [NOT] IN, IS [NOT] NULL, IS [NOT] EMPTY, [NOT] MEMBER [OF]
int p4 = getPrecedence(Ops.EQ, Ops.GT, Ops.GOE, Ops.LT, Ops.LOE, Ops.NE, Ops.BETWEEN, Ops.LIKE, Ops.LIKE_ESCAPE, Ops.IN,
Ops.IS_NULL, Ops.IS_NOT_NULL, JPQLOps.MEMBER_OF, JPQLOps.NOT_MEMBER_OF);
// NOT
int p5 = getPrecedence(Ops.NOT);
// AND
int p6 = getPrecedence(Ops.AND);
// OR
int p7 = getPrecedence(Ops.OR);
assertTrue(p1 < p2);
assertTrue(p2 < p3);
assertTrue(p3 < p4);
assertTrue(p4 < p5);
assertTrue(p5 < p6);
assertTrue(p6 < p7);
}
protected int getPrecedence(Operator... ops) {
int precedence = JPQLTemplates.DEFAULT.getPrecedence(ops[0]);
for (int i = 1; i < ops.length; i++) {
assertEquals(ops[i].name(), precedence, JPQLTemplates.DEFAULT.getPrecedence(ops[i]));
}
return precedence;
}
@Test
public void generic_precedence() {
for (JPQLTemplates templates : ImmutableList.of(
JPQLTemplates.DEFAULT, HQLTemplates.DEFAULT, EclipseLinkTemplates.DEFAULT)) {
TemplatesTestUtils.testPrecedence(templates);
}
}
}