/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.content;
import java.io.IOException;
import java.sql.SQLException;
import org.apache.log4j.Logger;
import org.dspace.AbstractUnitTest;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.*;
import org.junit.*;
import static org.junit.Assert.* ;
/**
* Unit Tests for class ItemComparator
* @author pvillega
*/
public class ItemComparatorTest extends AbstractUnitTest
{
/** log4j category */
private static final Logger log = Logger.getLogger(ItemComparatorTest.class);
protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService();
protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService();
private ItemService itemService = ContentServiceFactory.getInstance().getItemService();
protected WorkspaceItemService workspaceItemService = ContentServiceFactory.getInstance().getWorkspaceItemService();
protected InstallItemService installItemService = ContentServiceFactory.getInstance().getInstallItemService();
protected MetadataSchemaService metadataSchemaService = ContentServiceFactory.getInstance().getMetadataSchemaService();
protected MetadataFieldService metadataFieldService = ContentServiceFactory.getInstance().getMetadataFieldService();
private MetadataValueService metadataValueService = ContentServiceFactory.getInstance().getMetadataValueService();
/**
* Item instance for the tests
*/
private Item one;
/**
* Item instance for the tests
*/
private Item two;
private Collection collection;
private Community owningCommunity;
private MetadataField metadataField;
/**
* This method will be run before every test as per @Before. It will
* initialize resources required for the tests.
*
* Other methods can be annotated with @Before here or in subclasses
* but no execution order is guaranteed
*/
@Before
@Override
public void init()
{
try
{
super.init();
context.turnOffAuthorisationSystem();
MetadataSchema testSchema = metadataSchemaService.find(context, "dc");
metadataField = metadataFieldService.create(context, testSchema, "test", "one", null);
this.owningCommunity = communityService.create(null, context);
this.collection = collectionService.create(context, owningCommunity);
WorkspaceItem workspaceItem = workspaceItemService.create(context, collection, false);
this.one = installItemService.installItem(context, workspaceItem);
workspaceItem = workspaceItemService.create(context, collection, false);
this.two = installItemService.installItem(context, workspaceItem);
context.restoreAuthSystemState();
}
catch (AuthorizeException ex)
{
log.error("Authorization Error in init", ex);
fail("Authorization Error in init: " + ex.getMessage());
}
catch (SQLException ex)
{
log.error("SQL Error in init", ex);
fail("SQL Error in init:" + ex.getMessage());
} catch (NonUniqueMetadataException ex) {
log.error("Error in init", ex);
fail("Error in init:" + ex.getMessage());
}
}
/**
* This method will be run after every test as per @After. It will
* clean resources initialized by the @Before methods.
*
* Other methods can be annotated with @After here or in subclasses
* but no execution order is guaranteed
*/
@After
@Override
public void destroy()
{
context.turnOffAuthorisationSystem();
try{
// Remove all values added to the test MetadataField (MetadataField cannot be deleted if it is still used)
metadataValueService.deleteByMetadataField(context, metadataField);
// Delete the (unused) metadataField
metadataFieldService.delete(context, metadataField);
communityService.delete(context, owningCommunity);
context.restoreAuthSystemState();
} catch (SQLException | AuthorizeException | IOException ex) {
log.error("SQL Error in destroy", ex);
fail("SQL Error in destroy: " + ex.getMessage());
}
super.destroy();
}
/**
* Test of compare method, of class ItemComparator.
*/
@Test
public void testCompare() throws SQLException {
int result = 0;
ItemComparator ic = null;
//one of the tiems has no value
ic = new ItemComparator("test", "one", Item.ANY, true);
result = ic.compare(one, two);
assertTrue("testCompare 0",result == 0);
ic = new ItemComparator("test", "one", Item.ANY, true);
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "1");
result = ic.compare(one, two);
assertTrue("testCompare 1",result >= 1);
itemService.clearMetadata(context, one, "dc", "test", "one", Item.ANY);
ic = new ItemComparator("test", "one", Item.ANY, true);
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "1");
result = ic.compare(one, two);
assertTrue("testCompare 2",result <= -1);
itemService.clearMetadata(context, two, "dc", "test", "one", Item.ANY);
//value in both items
ic = new ItemComparator("test", "one", Item.ANY, true);
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "1");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "2");
result = ic.compare(one, two);
assertTrue("testCompare 3",result <= -1);
itemService.clearMetadata(context, one, "dc", "test", "one", Item.ANY);
itemService.clearMetadata(context, two, "dc", "test", "one", Item.ANY);
ic = new ItemComparator("test", "one", Item.ANY, true);
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "1");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "1");
result = ic.compare(one, two);
assertTrue("testCompare 4",result == 0);
itemService.clearMetadata(context, one, "dc", "test", "one", Item.ANY);
itemService.clearMetadata(context, two, "dc", "test", "one", Item.ANY);
ic = new ItemComparator("test", "one", Item.ANY, true);
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "2");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "1");
result = ic.compare(one, two);
assertTrue("testCompare 5",result >= 1);
itemService.clearMetadata(context, one, "dc", "test", "one", Item.ANY);
itemService.clearMetadata(context, two, "dc", "test", "one", Item.ANY);
//multiple values (min, max)
ic = new ItemComparator("test", "one", Item.ANY, true);
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "0");
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "1");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "2");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "3");
result = ic.compare(one, two);
assertTrue("testCompare 3",result <= -1);
itemService.clearMetadata(context, one, "dc", "test", "one", Item.ANY);
itemService.clearMetadata(context, two, "dc", "test", "one", Item.ANY);
ic = new ItemComparator("test", "one", Item.ANY, true);
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "0");
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "1");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "-1");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "1");
result = ic.compare(one, two);
assertTrue("testCompare 4",result == 0);
itemService.clearMetadata(context, one, "dc", "test", "one", Item.ANY);
itemService.clearMetadata(context, two, "dc", "test", "one", Item.ANY);
ic = new ItemComparator("test", "one", Item.ANY, true);
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "1");
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "2");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "1");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "-1");
result = ic.compare(one, two);
assertTrue("testCompare 5",result >= 1);
itemService.clearMetadata(context, one, "dc", "test", "one", Item.ANY);
itemService.clearMetadata(context, two, "dc", "test", "one", Item.ANY);
ic = new ItemComparator("test", "one", Item.ANY, false);
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "1");
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "2");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "2");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "3");
result = ic.compare(one, two);
assertTrue("testCompare 3",result <= -1);
itemService.clearMetadata(context, one, "dc", "test", "one", Item.ANY);
itemService.clearMetadata(context, two, "dc", "test", "one", Item.ANY);
ic = new ItemComparator("test", "one", Item.ANY, false);
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "1");
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "2");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "1");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "5");
result = ic.compare(one, two);
assertTrue("testCompare 4",result == 0);
itemService.clearMetadata(context, one, "dc", "test", "one", Item.ANY);
itemService.clearMetadata(context, two, "dc", "test", "one", Item.ANY);
ic = new ItemComparator("test", "one", Item.ANY, false);
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "2");
itemService.addMetadata(context, one, "dc", "test", "one", Item.ANY, "3");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "1");
itemService.addMetadata(context, two, "dc", "test", "one", Item.ANY, "4");
result = ic.compare(one, two);
assertTrue("testCompare 5",result >= 1);
itemService.clearMetadata(context, one, "dc", "test", "one", Item.ANY);
itemService.clearMetadata(context, two, "dc", "test", "one", Item.ANY);
}
/**
* Test of equals method, of class ItemComparator.
*/
@Test
@SuppressWarnings({"ObjectEqualsNull", "IncompatibleEquals"})
public void testEquals()
{
ItemComparator ic = new ItemComparator("test", "one", Item.ANY, true);
ItemComparator target = null;
assertFalse("testEquals 0", ic.equals(null));
assertFalse("testEquals 1", ic.equals("test one"));
target = new ItemComparator("test1", "one", Item.ANY, true);
assertFalse("testEquals 2", ic.equals(target));
target = new ItemComparator("test", "one1", Item.ANY, true);
assertFalse("testEquals 3", ic.equals(target));
target = new ItemComparator("test", "one", "es", true);
assertFalse("testEquals 4", ic.equals(target));
target = new ItemComparator("test1", "one", Item.ANY, false);
assertFalse("testEquals 5", ic.equals(target));
target = new ItemComparator("test", "one", Item.ANY, true);
assertTrue("testEquals 6", ic.equals(target));
}
}