package eu.dnetlib.enabling.resultset.push;

import static org.junit.Assert.*; // NOPMD

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

/**
 * subclass this unit test class and provide a concrete transient push resultset dao implementation.
 * 
 * @author marko
 *
 */
@Ignore
public abstract class AbstractTransientPushResultSetDaoTest {

	/**
	 * test first element.
	 */
	private static final String TWO = "two";

	/**
	 * test second element.
	 */
	private static final String ONE = "one";
	
	/**
	 * some key.
	 */
	private static final String RS_ID = "123";

	
	/**
	 * instance under test.
	 */
	private TransientPushResultSetDao dao;
	
	/**
	 * prepare the instance under test.
	 * 
	 */
	@Before
	public void setUp() {
		setDao(newInstance());
	}
	
	/**
	 * specific unit tests will override this method and 
	 * provide a concrete instance to test.
	 * 
	 * @return new transient push resultset dao instance
	 */
	protected abstract TransientPushResultSetDao newInstance();

	/**
	 * test add elements.
	 */
	@Test
	public void testAddElements() {
		final List<String> freshGet = getDao().getElements(RS_ID);
		assertNotNull("fresh get", freshGet);
		assertEquals("fresh get", 0, freshGet.size());
		
		final List<String> list = new ArrayList<String>();
		list.add(ONE);
		
		getDao().addElements(RS_ID, list);
		
		final List<String> firstGet = getDao().getElements(RS_ID);
		assertEquals("first get", 1, firstGet.size());
		assertEquals("first get", ONE, firstGet.get(0));
		
		final List<String> listAppend = new ArrayList<String>();
		listAppend.add(TWO);
		
		getDao().addElements(RS_ID, listAppend);
		
		final List<String> secondGet = getDao().getElements(RS_ID);
		assertEquals("second get", 2, secondGet.size());
		assertEquals("second get", ONE, secondGet.get(0));
		assertEquals("second get", TWO, secondGet.get(1));
		
	}

	/**
	 * check get elements.
	 */
	@Test
	public void testGetElements() {
		final List<String> list = new ArrayList<String>();
		list.add(ONE);
		
		getDao().addElements(RS_ID, list);
		
		final List<String> res = getDao().getElements(RS_ID);
		assertEquals("check size", 1, res.size());
		assertEquals("check element", ONE, res.get(0));		
	}

	public TransientPushResultSetDao getDao() {
		return dao;
	}

	public void setDao(final TransientPushResultSetDao dao) {
		this.dao = dao;
	}

}
