// Path: src/test/java/com/itranswarp/warpdb/test/User.java
// @Entity
// @Table(uniqueConstraints = @UniqueConstraint(name = "UNI_NameEmail", columnNames = { "name", "email" }), indexes = {
// 		@Index(name = "IDX_TagId", columnList = "the_tag"), @Index(unique = true, columnList = "name, the_tag") })
// public class User extends BaseEntity {
// 
// 	@Column(length = 100, nullable = false)
// 	public String name;
// 
// 	@Column(length = 100, unique = true, nullable = false, updatable = false)
// 	public String email;
// 
// 	private int age;
// 
// 	public int getAge() {
// 		return this.age;
// 	}
// 
// 	public void setAge(int age) {
// 		this.age = age;
// 	}
// 
// 	private double score;
// 
// 	public double getScore() {
// 		return this.score;
// 	}
// 
// 	public void setScore(double score) {
// 		this.score = score;
// 	}
// 
// 	@Transient
// 	public String fullName;
// 
// 	@Column(name = "the_tag")
// 	public String tag;
// 
// 	@Transient
// 	public List<Class<?>> callbacks = new ArrayList<>();
// 
// 	@PostLoad
// 	void postLoad() {
// 		callbacks.add(PostLoad.class);
// 	}
// 
// 	@PrePersist
// 	void prePersist() {
// 		callbacks.add(PrePersist.class);
// 		if (this.id == null) {
// 			this.id = nextId();
// 		}
// 		this.createdAt = this.updatedAt = System.currentTimeMillis();
// 	}
// 
// 	@PostPersist
// 	void postPersist() {
// 		callbacks.add(PostPersist.class);
// 	}
// 
// 	@PreUpdate
// 	void preUpdate() {
// 		callbacks.add(PreUpdate.class);
// 		this.updatedAt = System.currentTimeMillis();
// 	}
// 
// 	@PostUpdate
// 	void postUpdate() {
// 		callbacks.add(PostUpdate.class);
// 	}
// 
// 	@PreRemove
// 	void preRemove() {
// 		callbacks.add(PreRemove.class);
// 	}
// 
// 	@PostRemove
// 	void postRemove() {
// 		callbacks.add(PostRemove.class);
// 	}
// 
// }


import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.List;
import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
import javax.persistence.PostRemove;
import javax.persistence.PostUpdate;
import javax.persistence.PrePersist;
import javax.persistence.PreRemove;
import javax.persistence.PreUpdate;
import org.junit.Test;
import com.itranswarp.warpdb.test.User;
		assertTrue(u1.callbacks.contains(PostLoad.class));
		User u2 = warpdb.fetch(User.class, ids[1]);
		assertTrue(u2.callbacks.contains(PostLoad.class));
		// test list:
		List<User> us = warpdb.list(User.class, "SELECT * FROM User where id>?", ids[1]);
		assertEquals(2, us.size());
		assertTrue(us.get(0).callbacks.contains(PostLoad.class));
		assertTrue(us.get(1).callbacks.contains(PostLoad.class));
		// test criteria:
		List<User> users = warpdb.from(User.class).where("id>?", ids[1]).list();
		assertEquals(2, users.size());
		assertTrue(users.get(0).callbacks.contains(PostLoad.class));
		assertTrue(users.get(1).callbacks.contains(PostLoad.class));
	}

	@Test
	public void testUpdateProperties() throws Exception {
		User user = new User();
		user.name = "Michael";
		user.email = "michael@somewhere.org";
		warpdb.insert(user);
		Thread.sleep(100);
		user.name = "Changed";
		user.version = 99;
		warpdb.updateProperties(user, "name", "version", "updatedAt");
		assertTrue(user.callbacks.contains(PreUpdate.class));
		assertTrue(user.callbacks.contains(PostUpdate.class));
		assertNotEquals(user.createdAt, user.updatedAt);
		assertEquals(System.currentTimeMillis(), user.updatedAt, 500.0);
		// fetch:
// Path: src/test/java/com/itranswarp/warpdb/test/User.java
// @Entity
// @Table(uniqueConstraints = @UniqueConstraint(name = "UNI_NameEmail", columnNames = { "name", "email" }), indexes = {
// 		@Index(name = "IDX_TagId", columnList = "the_tag"), @Index(unique = true, columnList = "name, the_tag") })
// public class User extends BaseEntity {
// 
// 	@Column(length = 100, nullable = false)
// 	public String name;
// 
// 	@Column(length = 100, unique = true, nullable = false, updatable = false)
// 	public String email;
// 
// 	private int age;
// 
// 	public int getAge() {
// 		return this.age;
// 	}
// 
// 	public void setAge(int age) {
// 		this.age = age;
// 	}
// 
// 	private double score;
// 
// 	public double getScore() {
// 		return this.score;
// 	}
// 
// 	public void setScore(double score) {
// 		this.score = score;
// 	}
// 
// 	@Transient
// 	public String fullName;
// 
// 	@Column(name = "the_tag")
// 	public String tag;
// 
// 	@Transient
// 	public List<Class<?>> callbacks = new ArrayList<>();
// 
// 	@PostLoad
// 	void postLoad() {
// 		callbacks.add(PostLoad.class);
// 	}
// 
// 	@PrePersist
// 	void prePersist() {
// 		callbacks.add(PrePersist.class);
// 		if (this.id == null) {
// 			this.id = nextId();
// 		}
// 		this.createdAt = this.updatedAt = System.currentTimeMillis();
// 	}
// 
// 	@PostPersist
// 	void postPersist() {
// 		callbacks.add(PostPersist.class);
// 	}
// 
// 	@PreUpdate
// 	void preUpdate() {
// 		callbacks.add(PreUpdate.class);
// 		this.updatedAt = System.currentTimeMillis();
// 	}
// 
// 	@PostUpdate
// 	void postUpdate() {
// 		callbacks.add(PostUpdate.class);
// 	}
// 
// 	@PreRemove
// 	void preRemove() {
// 		callbacks.add(PreRemove.class);
// 	}
// 
// 	@PostRemove
// 	void postRemove() {
// 		callbacks.add(PostRemove.class);
// 	}
// 
// }


// Path: src/test/java/com/itranswarp/warpdb/WarpDbCRUDAndCallbackTest.java
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.List;
import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
import javax.persistence.PostRemove;
import javax.persistence.PostUpdate;
import javax.persistence.PrePersist;
import javax.persistence.PreRemove;
import javax.persistence.PreUpdate;
import org.junit.Test;
import com.itranswarp.warpdb.test.User;

		assertTrue(u1.callbacks.contains(PostLoad.class));
		User u2 = warpdb.fetch(User.class, ids[1]);
		assertTrue(u2.callbacks.contains(PostLoad.class));
		// test list:
		List<User> us = warpdb.list(User.class, "SELECT * FROM User where id>?", ids[1]);
		assertEquals(2, us.size());
		assertTrue(us.get(0).callbacks.contains(PostLoad.class));
		assertTrue(us.get(1).callbacks.contains(PostLoad.class));
		// test criteria:
		List<User> users = warpdb.from(User.class).where("id>?", ids[1]).list();
		assertEquals(2, users.size());
		assertTrue(users.get(0).callbacks.contains(PostLoad.class));
		assertTrue(users.get(1).callbacks.contains(PostLoad.class));
	}

	@Test
	public void testUpdateProperties() throws Exception {
		User user = new User();
		user.name = "Michael";
		user.email = "michael@somewhere.org";
		warpdb.insert(user);
		Thread.sleep(100);
		user.name = "Changed";
		user.version = 99;
		warpdb.updateProperties(user, "name", "version", "updatedAt");
		assertTrue(user.callbacks.contains(PreUpdate.class));
		assertTrue(user.callbacks.contains(PostUpdate.class));
		assertNotEquals(user.createdAt, user.updatedAt);
		assertEquals(System.currentTimeMillis(), user.updatedAt, 500.0);
		// fetch:
		User bak = warpdb.fetch(User.class, user.id);