package org.nutz.dao.texp;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.nutz.dao.Cnd;
import org.nutz.dao.Condition;
import org.nutz.dao.entity.Entity;
import org.nutz.dao.test.DaoCase;
import org.nutz.dao.util.cri.SqlExpression;
import org.nutz.lang.Lang;
public class CndTest extends DaoCase {
private Entity<?> en;
protected void before() {
en = dao.create(Worker.class, true);
}
protected void after() {}
@Test
public void test_segment() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "比尔盖茨");
map.put("age", 50);
Condition c1 = Cnd.wrap("name='${name}' AND age>${age}", map);
assertEquals("name='比尔盖茨' AND age>50", c1.toSql(en));
Worker worker = new Worker();
worker.name = "老板";
worker.age = 30;
Condition c2 = Cnd.wrap("name like'${name}%' AND age>${age}", worker);
assertEquals("name like'老板%' AND age>30", c2.toSql(en));
}
@Test
public void test_gt_like() {
Condition c = Cnd.where("id", ">", 45).and("name", "LIKE", "%ry%");
String exp = "WHERE wid>45 AND wname LIKE '%ry%'";
assertEquals(exp, c.toSql(en).trim());
}
@Test
public void test_bracket() {
Condition c = Cnd.where(Cnd.exps("id", ">", 45)).and("name",
"LIKE",
"%ry%");
String exp = "WHERE (wid>45) AND wname LIKE '%ry%'";
assertEquals(exp, c.toSql(en).trim());
}
@Test
public void test_order() {
Condition c = Cnd.orderBy()
.asc("id")
.desc("name")
.asc("age")
.desc("workingDay");
String exp = "ORDER BY wid ASC, wname DESC, age ASC, days DESC";
assertEquals(exp, c.toSql(en).trim());
}
@Test
public void test_like_in() {
int[] ages = {4, 7, 9};
SqlExpression e = Cnd.exps("age", ">", 35).and("id", "<", 47);
SqlExpression e2 = Cnd.exps("name", "\tLIKE ", "%t%")
.and("age", "IN \n\r", ages)
.or(e);
Condition c = Cnd.where("id", "=", 37)
.and(e)
.or(e2)
.asc("age")
.desc("id");
String exp = "WHERE wid=37 AND (age>35 AND wid<47) OR (wname LIKE '%t%' AND age IN (4,7,9) OR (age>35 AND wid<47)) ORDER BY age ASC, wid DESC";
assertEquals(exp, c.toSql(en).trim());
}
@Test
public void test_equel() {
Condition c = Cnd.where("ff", "=", true);
String exp = "WHERE ff=true";
assertEquals(exp, c.toSql(en).trim());
}
@Test
public void test_in_by_int_array() {
int[] ids = {3, 5, 7};
Condition c = Cnd.where("id", "iN", ids);
String exp = "WHERE id IN (3,5,7)";
assertEquals(exp, c.toSql(null).trim());
}
@Test
public void test_in_by_int_list() {
List<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(5);
list.add(7);
Condition c = Cnd.where("id", "iN", list);
String exp = "WHERE id IN (3,5,7)";
assertEquals(exp, c.toSql(null).trim());
}
@Test
public void test_in_by_str_array() {
Condition c = Cnd.where("nm", "iN", Lang.array("'A'", "B"));
String exp = "WHERE nm IN ('''A''','B')";
assertEquals(exp, c.toSql(null).trim());
}
@Test
public void test_in_by_str_list() {
List<String> list = new ArrayList<String>();
list.add("'A'");
list.add("B");
Condition c = Cnd.where("nm", "iN", list);
String exp = "WHERE nm IN ('''A''','B')";
assertEquals(exp, c.toSql(null).trim());
}
@Test
public void test_is_null() {
Condition c = Cnd.where("nm", " is ", null);
String exp = "WHERE nm IS NULL";
assertEquals(exp, c.toSql(null).trim());
}
@Test
public void test_is_not_null() {
Condition c = Cnd.where("nm", " is nOT ", null);
String exp = "WHERE nm IS NOT NULL";
assertEquals(exp, c.toSql(null).trim());
}
@Test
public void test_not_in() {
Condition c = Cnd.where("nm", " Not iN ", new int[]{1, 2, 3});
String exp = "WHERE nm NOT IN (1,2,3)";
assertEquals(exp, c.toSql(null).trim());
}
@Test
public void test_add_other_or_method_by_github_issuse_148() {
SqlExpression e1 = Cnd.exps("city", "=", "beijing")
.or("city", "=", "shanghai")
.or("city", "=", "guangzhou")
.or("city", "=", "shenzhen");
SqlExpression e2 = Cnd.exps("age", ">", 18).and("age", "<", 30);
String exp = "WHERE (ct='beijing' OR ct='shanghai' OR ct='guangzhou' OR ct='shenzhen') AND (age>18 AND age<30)";
assertEquals(exp, Cnd.where(e1).and(e2).toSql(en).trim());
}
@Test
public void test_other_op() {
assertEquals(" WHERE ok IS true", Cnd.where("ok", "is", true)
.toString());
}
}