package eu.dnetlib.dlms.config;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import javax.annotation.Resource;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import eu.dnetlib.dlms.lowlevel.objects.Set;
import eu.dnetlib.dlms.lowlevel.objects.SetDAO;
import eu.dnetlib.dlms.lowlevel.objects.structures.Structure;
import eu.dnetlib.dlms.lowlevel.types.AtomType;
import eu.dnetlib.dlms.lowlevel.types.AtomTypeDAO;
import eu.dnetlib.dlms.lowlevel.types.SetType;
import eu.dnetlib.dlms.lowlevel.types.SetTypeDAO;

/**
 * @author lexis
 * 
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class SystemSetsHelperTest {

	@Resource
	private SystemSetsHelper systemSetsHelper;

	@Resource
	private AtomType atomType1;
	@Resource
	private SetType setType1;
	@Resource
	private Set atomSet1;

	@Resource
	private AtomTypeDAO atomTypeDAO;
	@Resource
	private SetTypeDAO setTypeDAO;
	@Resource
	private SetDAO extSetDAO;

	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		this.atomTypeDAO.save(this.atomType1);
		this.setTypeDAO.save(this.setType1);
		this.extSetDAO.save(this.atomSet1);
	}

	/**
	 * Test method for {@link eu.dnetlib.dlms.config.SystemSetsHelper#isSystemSet(eu.dnetlib.dlms.lowlevel.objects.Set)}
	 * .
	 */
	@Test
	@DirtiesContext
	public void testIsSystemSet() {
		assertFalse(this.systemSetsHelper.isSystemSet(this.atomSet1));
		assertTrue(this.systemSetsHelper.isSystemSet(this.extSetDAO.getSetByName(SystemSetsNames.ALL_SETS)));
	}

	/**
	 * Test method for
	 * {@link eu.dnetlib.dlms.config.SystemSetsHelper#getSystemSetNameFor(eu.dnetlib.dlms.lowlevel.objects.Set)}.
	 */
	@Test
	@DirtiesContext
	public void testGetSystemSetNameFor() {
		assertEquals(this.systemSetsHelper.getSystemSetNameFor(this.atomSet1), SystemSetsNames.ATOM_SETS);
	}

	/**
	 * Test method for
	 * {@link eu.dnetlib.dlms.config.SystemSetsHelper#removeSystemEntryFor(eu.dnetlib.dlms.lowlevel.objects.Set)}.
	 */
	@Test
	@DirtiesContext
	public void testRemoveSystemEntryFor() {
		final Structure s = this.systemSetsHelper.findSystemStructureFor(this.atomSet1);
		final Set atoms = this.extSetDAO.getSetByName(SystemSetsNames.ATOM_SETS);
		this.extSetDAO.load(atoms);
		assertTrue(atoms.containsObject(s));
		this.systemSetsHelper.removeSystemEntryFor(this.atomSet1);
		final Set atoms2 = this.extSetDAO.getSetByName(SystemSetsNames.ATOM_SETS);
		this.extSetDAO.load(atoms2);
		assertFalse(atoms2.containsObject(s));

	}

	/**
	 * Test method for
	 * {@link eu.dnetlib.dlms.config.SystemSetsHelper#findSystemStructureFor(eu.dnetlib.dlms.lowlevel.objects.Set)}.
	 */
	@Test
	@DirtiesContext
	public void testFindSystemStructureFor() {
		assertNotNull(this.systemSetsHelper.findStructureForSet(this.atomSet1.getId(), this.extSetDAO.getSetByName(SystemSetsNames.ATOM_SETS)));
		assertNull(this.systemSetsHelper.findStructureForSet(this.atomSet1.getId(), this.extSetDAO.getSetByName(SystemSetsNames.REL_SETS)));
	}

	/**
	 * Test method for
	 * {@link eu.dnetlib.dlms.config.SystemSetsHelper#getSystemSetFor(eu.dnetlib.dlms.lowlevel.objects.Set)}.
	 */
	@Test
	@DirtiesContext
	public void testGetSystemSetFor() {
		final Set systemAtoms = this.extSetDAO.getSetByName(SystemSetsNames.ATOM_SETS);
		assertEquals(this.systemSetsHelper.getSystemSetFor(this.atomSet1), systemAtoms);
	}

	/**
	 * Test method for
	 * {@link eu.dnetlib.dlms.config.SystemSetsHelper#findStructureForSet(long, eu.dnetlib.dlms.lowlevel.objects.Set)}.
	 */
	@Test
	@DirtiesContext
	public void testFindStructureForSet() {
		assertNotNull(this.systemSetsHelper.findSystemStructureFor(this.atomSet1));
	}

	/**
	 * Test method for
	 * {@link eu.dnetlib.dlms.config.SystemSetsHelper#createStructureFor(eu.dnetlib.dlms.lowlevel.objects.Set)}.
	 */
	@Test
	@DirtiesContext
	public void testCreateStructureForSet() {
		assertNotNull(this.systemSetsHelper.createStructureFor(this.atomSet1));
	}

}
