/
codebase/src/net/sourceforge/pain/admin/console/command/
codebase/src/net/sourceforge/pain/data/role/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/util/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
mudlibs/tinylib/
mudlibs/tinylib/area/
mudlibs/tinylib/etc/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/prototype/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/deploy/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/fn/util/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/impl/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/command/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/reset/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/shutdown/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/social/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/util/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.db;

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

import java.io.*;
import java.util.*;

/**
 * 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();
    }

    public void testWeakExtentIterator1() throws IOException {
        db.beginTransaction();
        AllFieldTypesObject obj1 = new AllFieldTypesObject(db);
        AllFieldTypesObject obj2 = new AllFieldTypesObject(db);
        AllFieldTypesObject obj3 = new AllFieldTypesObject(db);
        Iterator it = obj1.getDbClass().extentIterator(true);
        assertTrue(it.hasNext());
        assertEquals(obj1, it.next());
        obj2.delete();
        assertTrue(it.hasNext());
        assertEquals(obj3, it.next());
        assertFalse(it.hasNext());
        db.commitTransaction();
    }

    public void testWeakExtentIterator2() throws IOException {
        AllFieldTypesObject obj1 = new AllFieldTypesObject(db);
        AllFieldTypesObject obj2 = new AllFieldTypesObject(db);
        AllFieldTypesObject obj3 = new AllFieldTypesObject(db);

        db.beginTransaction();
        Iterator it = obj1.getDbClass().extentIterator(true);
        assertTrue(it.hasNext());
        assertEquals(obj1, it.next());
        obj2.delete();
        assertTrue(it.hasNext());
        assertEquals(obj3, it.next());
        assertFalse(it.hasNext());
        db.commitTransaction();
        assertFalse(it.hasNext());
    }

    public void testWeakExtentIterator3() throws IOException {
        AllFieldTypesObject obj1 = new AllFieldTypesObject(db);
        AllFieldTypesObject obj2 = new AllFieldTypesObject(db);
        AllFieldTypesObject obj3 = new AllFieldTypesObject(db);

        db.beginTransaction();
        Iterator it = obj1.getDbClass().extentIterator(true);
        assertTrue(it.hasNext());
        assertEquals(obj1, it.next());
        obj2.delete();
        assertTrue(it.hasNext());
        assertEquals(obj3, it.next());
        assertFalse(it.hasNext());
        db.rollbackTransaction();
        ;
        assertTrue(it.hasNext());//removed object restored
        assertEquals(obj2, it.next());
        assertFalse(it.hasNext());
        AllFieldTypesObject obj4 = new AllFieldTypesObject(db);
        assertTrue(it.hasNext());//removed object restored
        assertEquals(obj4, it.next());
        assertFalse(it.hasNext());
    }

}