/
area/
classes/net/sourceforge/pain/logic/
classes/net/sourceforge/pain/logic/event/
classes/net/sourceforge/pain/logic/fn/util/
classes/net/sourceforge/pain/network/console/
classes/net/sourceforge/pain/plugin/
classes/net/sourceforge/pain/plugin/reset/
classes/net/sourceforge/pain/plugin/shutdown/
classes/net/sourceforge/pain/plugin/social/
classest/net/sourceforge/pain/db/data/
doc/
doc/paindb/resources/
src/net/sourceforge/pain/logic/
src/net/sourceforge/pain/logic/event/
src/net/sourceforge/pain/logic/fn/util/
src/net/sourceforge/pain/network/console/
src/net/sourceforge/pain/network/console/telnet/
src/net/sourceforge/pain/plugin/
src/net/sourceforge/pain/plugin/command/
src/net/sourceforge/pain/plugin/reset/
src/net/sourceforge/pain/plugin/shutdown/
src/net/sourceforge/pain/plugin/social/
src/net/sourceforge/pain/util/
tests/
tests/net/sourceforge/pain/db/data/
package net.sourceforge.pain.db;

import junit.framework.*;

import java.io.*;

import net.sourceforge.pain.db.data.*;

/**
 * User: fmike  Date: Aug 26, 2003   Time: 3:30:29 AM
 */
public final class ClassStateTest extends TestCase {


	private PainDB db;

	public ClassStateTest() {
		super("ClassStateTest");
	}

	protected void setUp() throws Exception {
		db = new PainDB(getName() + ".db");
		db.ALLOW_PLAIN_WRITE = true; // allow work without transactions
		db.MANUAL_FLUSH_MODE = true; // commit will not flush (objects stays dirty)

	}

	protected void tearDown() throws Exception {
		if (db != null) {
			File file = new File(db.getDbFileName());
			if (!db.isClosed()) {
				db.forceClose();
			}
			db = null;
			file.delete();
		}
	}

	/** create object, delete class, commit, ensure that obj is detached */
	public void testState1() throws Exception {
		db.beginTransaction();
		AllFieldTypesObject obj = new AllFieldTypesObject(db);
		DbClass dbClass = obj.getDbClass();
		dbClass.delete();
		assertTrue(obj.isDeleted());
		db.commitTransaction();
		assertTrue(obj.isDetached());
		assertNull(db.getDbClass(obj.getClass()));
	}

	/** create object, rollback, ensure that obj is detached */
	public void testState2() {
		db.beginTransaction();
		AllFieldTypesObject obj = new AllFieldTypesObject(db);
		DbClass dbClass = obj.getDbClass();
		Object classId = dbClass.getOid();
		Object oid = obj.getOid();
		assertTrue(obj.isNew());
		assertSame(obj, db.getObject(oid));
		assertSame(dbClass, db.getClass(classId));
		db.rollbackTransaction();
		assertNull(db.getObject(oid));
		assertNull(db.getClass(classId));
		assertNull(db.getDbClass(obj.getClass()));
		assertTrue(obj.isDetached());
	}

	/** create object, delete class, rollback, ensure that obj is detached */
	public void testState3() {
		db.beginTransaction();
		AllFieldTypesObject obj = new AllFieldTypesObject(db);
		DbClass dbClass = obj.getDbClass();
		Object classId = dbClass.getOid();
		Object oid = obj.getOid();
		dbClass.delete();
		assertTrue(obj.isDeleted());
		assertNull(db.getObject(oid));
		assertNull(db.getClass(classId));
		db.rollbackTransaction();
		assertNull(db.getObject(oid));
		assertNull(db.getClass(classId));
		assertNull(db.getDbClass(obj.getClass()));
	}

	/** create object, rollback, ensure that new object creation will have new dbclass instance*/
	public void testState4() throws Exception {
		db.beginTransaction();
		AllFieldTypesObject obj = new AllFieldTypesObject(db);
		DbClass dbClass1 = obj.getDbClass();
		db.rollbackTransaction();
		assertTrue(obj.isDetached());

		db.beginTransaction();
		obj = new AllFieldTypesObject(db);
		final DbClass dbClass2 = obj.getDbClass();
		assertNotSame(dbClass2, dbClass1);
		assertTrue(obj.isNew());
		db.commitTransaction();

		db.beginTransaction();
		obj = new AllFieldTypesObject(db);
		assertSame(obj.getDbClass(), dbClass2);
		db.commitTransaction();

	}

	/** create object, commit, new trans, delete class, rollback, ensure that class is alive*/
	public void testState5() throws Exception {
		db.beginTransaction();
		AllFieldTypesObject obj = new AllFieldTypesObject(db);
		DbClass dbClass1 = obj.getDbClass();
		db.commitTransaction();
		assertTrue(obj.isDirty());

		db.beginTransaction();
		dbClass1.delete();
		assertTrue(obj.isDeleted());
		db.rollbackTransaction();

		db.beginTransaction();
		assertTrue(obj.isDirty());
		assertSame(dbClass1, obj.getDbClass());
		assertSame(db.getDbClass(obj.getClass()), dbClass1);
		db.commitTransaction();
	}

}