package org.nutz.dao.test.normal; import static org.junit.Assert.*; import java.lang.reflect.Field; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; import org.junit.Test; import org.nutz.castor.Castors; import org.nutz.castor.FailToCastObjectException; import org.nutz.dao.Chain; import org.nutz.dao.entity.annotation.*; import org.nutz.dao.test.DaoCase; import org.nutz.lang.Lang; import org.nutz.lang.Mirror; import org.nutz.lang.meta.Email; public class SupportedFieldTypeTest extends DaoCase { @Override protected void before() { dao.create(EntityTypes.class, true); } public static enum TT { A, B } @Table("dao_supported_type") public static class EntityTypes { @Column @Id public int id; @Column @Name public String name; @Column @Default("zozoh@gmail.com") public Email email; @Column public TT enum_s; // It will auto detect db, and use INT @Column public TT enum_i; @Column public boolean bool_p; @Column public Boolean bool_obj; @Column public char char_p; @Column public Character char_obj; @Column public Date sqlDate; @Column public Time sqlTime; @Column public Timestamp sqlDT; @Column public int int_p; @Column public Integer int_obj; @Column public float float_p; @Column public Float float_obj; @Column public short short_p; @Column public Short short_obj; @Column public byte byte_p; @Column public Byte byte_obj; @Column public long long_p; @Column public Long long_obj; @Column public double double_p; @Column public Double double_obj; } @Test public void insert_char_field() { dao.insert(EntityTypes.class, Chain .make("char_p", 't') .add("char_obj", Character.valueOf('O')) .add("name", "ABC")); EntityTypes et = dao.fetch(EntityTypes.class); assertEquals('t', et.char_p); assertEquals('O', et.char_obj.charValue()); } @Test public void insert_timestamp_field() { Timestamp tm = new Timestamp(System.currentTimeMillis()); dao.insert(EntityTypes.class, Chain.make("name", "ABC").add("sqlDT", tm)); EntityTypes et = dao.fetch(EntityTypes.class); if (dao.meta().isPostgresql()) assertEquals(tm.getTime(), et.sqlDT.getTime()); else assertEquals(tm.getTime() / 1000, et.sqlDT.getTime() / 1000); } @Test public void check_for_sqlTime() { Time time = Castors.me().castTo("07:09:12", Time.class); dao.insert(EntityTypes.class, Chain.make("name", "ABC").add("sqlTime", time)); EntityTypes et = dao.fetch(EntityTypes.class); assertEquals(time.toString(), et.sqlTime.toString()); } @Test public void check_update_sqlTimestamp() { EntityTypes exp = new EntityTypes(); exp.name = "T"; Timestamp tm = new Timestamp(System.currentTimeMillis()); exp.sqlDT = tm; dao.insert(exp); exp = dao.fetch(EntityTypes.class, "T"); // MySql TIMESTAMP precision only to second assertEquals(tm.getTime() / 1000, exp.sqlDT.getTime() / 1000); } @Test public void check_if_support_all_normal_types() throws FailToCastObjectException { String d = "2009-02-01"; String t = "12:23:23"; String dt = d + " " + t; Date date = Castors.me().castTo(d, Date.class); Time time = Castors.me().castTo(t, Time.class); Timestamp ts = Castors.me().castTo(dt, Timestamp.class); EntityTypes exp = new EntityTypes(); exp.name = "XX"; exp.enum_s = TT.B; exp.enum_i = TT.A; exp.char_p = 'G'; exp.char_obj = 'O'; exp.int_p = 23; exp.int_obj = 23; exp.float_p = 34.67f; exp.float_obj = 34.68f; exp.short_p = 6; exp.short_obj = 6; exp.byte_p = 2; exp.byte_obj = 4; exp.long_p = 56787; exp.long_obj = 5678L; exp.double_p = 2.4325243; exp.double_obj = 3.4325243; exp.sqlDate = date; exp.sqlTime = time; exp.sqlDT = ts; dao.insert(exp); EntityTypes et = dao.fetch(EntityTypes.class); assertEquals(exp.id, et.id); Mirror<EntityTypes> me = Mirror.me(EntityTypes.class); for (Field f : me.getFields()) { Object expValue; Object ttValue; // Mysql 5.0.18, 会去掉毫秒数 if (f.getName().equals("sqlTime") && (dao.meta().isMySql() || dao.meta().isHsql())) { expValue = me.getValue(exp, f).toString(); ttValue = me.getValue(et, f).toString(); } // 其他的数据库无所谓 else { expValue = me.getValue(exp, f); ttValue = me.getValue(et, f); if (null == expValue) continue; } if (!expValue.equals(ttValue) && !dao.meta().isDB2()) //DB2的精度有点问题 throw Lang.makeThrow( "'%s' expect [%s] but it was [%s]", f.getName(), expValue, ttValue); } assertTrue(true); } @Test public void check_insert_null_timestamp_field() { EntityTypes exp = new EntityTypes(); exp.name = "JJ"; dao.insert(exp); assertTrue(true); } }