/
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 24, 2003  * Time: 11:15:30 PM
 */
public final class GlobalFeaturesTest extends TestCase {

	private PainDB db;

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

	protected void setUp() throws Exception {
		db = new PainDB(getName() + ".db");
		db.ALLOW_PLAIN_WRITE = true; // allow work without transactions
	}

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

	}

	public void testBackup1() throws Exception {
		db.beginTransaction();
		final int N = 100;
		for (int i = 0; i < N; i++) {
			new AllFieldTypesObject(db);
		}
		db.commitTransaction();
		DbClass dbClass = db.getDbClass(AllFieldTypesObject.class);
		assertEquals(N, dbClass.getNumberOfObjects());

		final String fileName = db.getDbFileName();
		String backupName = fileName + ".backup";
		db.backupTo(backupName, true);
		db.close();

		db = new PainDB(backupName);
		new File(fileName).delete(); // old db file

		dbClass = db.getDbClass(AllFieldTypesObject.class);
		assertEquals(N, dbClass.getNumberOfObjects());
	}


	public void testExportImport1() throws Exception {
	    String xmlFileName = "testExportImport1.xml";
		String newDbFileName  = "testExportImport1.pdb";
        new File(xmlFileName).delete();
		new File(newDbFileName).delete();

		db.beginTransaction();
		final int N = 100;
		Object oids[] = new Object[N];
		for (int i = 0; i < N; i++) {
			AllFieldTypesObject obj = new AllFieldTypesObject(db);
			fillObject(obj, i);
			oids[i] = obj.getOid();
		}
		db.setRoot(db.getObject(oids[10]));
		assertSame(db.getRoot(), db.getObject(oids[10]));
		db.commitTransaction();
		assertSame(db.getRoot(), db.getObject(oids[10]));
		db.exportToXml(xmlFileName);
		db.close();

		db = PainDB.importFromXml(xmlFileName, newDbFileName);
		db.beginTransaction();
		for (int i = 0; i < N; i++) {
			AllFieldTypesObject obj = (AllFieldTypesObject) db.getObject(oids[i]);
			checkObject(obj, i);
		}
		assertSame(db.getRoot(), db.getObject(oids[10]));
		db.commitTransaction();
		db.close();

		new File(xmlFileName).delete();
		new File(newDbFileName).delete();
	}

	private void fillObject(AllFieldTypesObject obj, int i) {
		obj.setSTRING("some string " + i);
		obj.setINT(i);
		obj.setLONG(i * (long) i);
		obj.setBOOLEAN((i & 0x1) == 0);
		obj.setREFERENCE(obj);
		obj.getINT_KEY_MAP().put(i, obj);
		obj.getSTRING_MAP().put("key" + i, "value" + i);
		obj.getSTRING_SET().add("" + i);
		obj.setARRAY_OF_STRING(new String[]{"" + i});
		obj.setARRAY_OF_INT(new int[]{i});
	}

	private void checkObject(AllFieldTypesObject obj, int i) {
		assertEquals(obj.getSTRING(), "some string " + i);
		assertEquals(obj.getINT(), i);
		assertEquals(obj.getLONG(), i * (long) i);
		assertEquals(obj.getBOOLEAN(), (i & 0x1) == 0);
		assertSame(obj.getREFERENCE(), obj);
		assertSame(obj.getINT_KEY_MAP().get(i) , obj);
		assertEquals(obj.getSTRING_MAP().get("key" + i), "value" + i);
		assertTrue(obj.getSTRING_SET().contains("" + i));
		assertEquals(obj.getARRAY_OF_STRING().length, 1);
		assertEquals(obj.getARRAY_OF_STRING()[0], "" + i);
		assertEquals(obj.getARRAY_OF_INT().length, 1);
		assertEquals(obj.getARRAY_OF_INT()[0], i);
	}

}