package com.j256.ormlite.field.types;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

import org.junit.Test;

import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;

public class LongObjectTypeTest extends BaseTypeTest {

	private static final String LONG_COLUMN = "longField";

	@Test
	public void testLongObj() throws Exception {
		Class<LocalLongObj> clazz = LocalLongObj.class;
		Dao<LocalLongObj, Object> dao = createDao(clazz, true);
		Long val = 13312321312312L;
		String valStr = val.toString();
		LocalLongObj foo = new LocalLongObj();
		foo.longField = val;
		assertEquals(1, dao.create(foo));
		testType(dao, foo, clazz, val, val, val, valStr, DataType.LONG_OBJ, LONG_COLUMN, true, true, false, false,
				false, false, true, true);
	}

	@Test
	public void testLongObjNull() throws Exception {
		Class<LocalLongObj> clazz = LocalLongObj.class;
		Dao<LocalLongObj, Object> dao = createDao(clazz, true);
		LocalLongObj foo = new LocalLongObj();
		assertEquals(1, dao.create(foo));
		testType(dao, foo, clazz, null, null, null, null, DataType.LONG_OBJ, LONG_COLUMN, true, true, false, false,
				false, false, true, true);
	}

	@Test
	public void testVersion() throws Exception {
		Dao<LongVersion, Integer> dao = createDao(LongVersion.class, true);
		LongVersion foo = new LongVersion();
		assertNull(foo.version);
		assertEquals(1, dao.create(foo));
		assertEquals(Long.valueOf(1), foo.version);
		assertEquals(1, dao.update(foo));
		assertEquals(Long.valueOf(2), foo.version);
	}

	/* ============================================================================================ */

	@DatabaseTable(tableName = TABLE_NAME)
	protected static class LocalLongObj {
		@DatabaseField(columnName = LONG_COLUMN)
		Long longField;
	}

	protected static class LongVersion {
		@DatabaseField(generatedId = true)
		int id;
		@DatabaseField(version = true)
		Long version;
	}
}