package de.hub.emffrag.fragmentation;
import java.util.Iterator;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import de.hub.emffrag.datastore.StringKeyType;
import de.hub.emffrag.model.emffrag.IndexedMap;
import de.hub.emffrag.testmodels.testmodel.TestObject;
import de.hub.emffrag.testmodels.testmodel.frag.meta.TestModelFactory;
public class IndexedMapTests extends AbstractFragmentationTests {
protected IndexedMap<String, TestObject> testIndex;
@Before
public void indexInitialization() {
testIndex = TestModelFactory.eINSTANCE.createTestObjectIndex();
}
protected void assertFragmentsIndex() {
model.assertFragmentsIndex(0l, 3l);
}
protected void assertIdIndex(boolean plusOne) {
model.assertIdIndex(0l, plusOne ? 4l : 3l);
}
@Test
public void addObjectsToMapTest() {
root.getContents().add(testIndex);
root.getContents().add(object1);
object1.getFragmentedContents().add(object2);
object1.getRegularContents().add(object3);
testIndex.put("1", object1);
testIndex.put("2", object2);
testIndex.put("3", object3);
model.save(null);
reinitializeModel();
testIndex = assertTestIndex(0);
assertIndex(testIndex, "1", "3");
assertIndexedObject(testIndex, "1");
assertIndexedObject(testIndex, "2");
assertIndexedObject(testIndex, "3");
assertFragmentsIndex();
assertIdIndex(false);
model.assertIndexClassIndex(testIndex, "1", "3", StringKeyType.instance);
}
@Test
public void iteratorTest() {
addObjectsToMapTest();
Iterator<TestObject> iterator = testIndex.iterator();
assertIterator(iterator, 3);
}
@Test
public void boundedIteratorTest1() {
performBoundedIteratorTest("0", "4", 3);
}
@Test
public void boundedIteratorTest2() {
performBoundedIteratorTest("1", "4", 3);
}
@Test
public void boundedIteratorTest3() {
performBoundedIteratorTest("0", "3", 3);
}
@Test
public void boundedIteratorTest4() {
performBoundedIteratorTest("1", "3", 3);
}
@Test
public void boundedIteratorTest5() {
performBoundedIteratorTest("0", "2", 2);
}
@Test
public void boundedIteratorTest6() {
performBoundedIteratorTest("2", "3", 2);
}
@Test
public void boundedIteratorTest7() {
performBoundedIteratorTest("1", "2", 2);
}
@Test
public void boundedIteratorTest8() {
performBoundedIteratorTest("2", "2", 1);
}
@Test
public void boundedIteratorTest9() {
performBoundedIteratorTest("3", "3", 1);
}
private void performBoundedIteratorTest(String first, String last, int size) {
addObjectsToMapTest();
Iterator<TestObject> iterator = testIndex.iterator(first, last);
assertIterator(iterator, size);
}
@Test
public void removeObjectsFromMapTest() {
addObjectsToMapTest();
testIndex.remove("2");
assertIndexedObject(testIndex, "1");
Assert.assertNull("Object is not null.", testIndex.exact("2"));
assertIndexedObject(testIndex, "3");
assertIterator(testIndex.iterator(), 2);
assertFragmentsIndex();
assertIdIndex(false);
model.assertIndexClassIndex(testIndex, "1", "3", StringKeyType.instance);
}
@Test
public void nextValueTests1() {
addObjectsToMapTest();
object1 = testIndex.next("1");
assertObject(object1);
Assert.assertEquals("Next gives wrong object.", testIndex.exact("1"), object1);
}
@Test
public void nextValueTests2() {
addObjectsToMapTest();
object1 = testIndex.next("0");
assertObject(object1);
Assert.assertEquals("Next gives wrong object.", testIndex.exact("1"), object1);
}
@Test
public void nextValueTests3() {
removeObjectsFromMapTest();
object1 = testIndex.next("2");
assertObject(object1);
Assert.assertEquals("Next gives wrong object.", testIndex.exact("3"), object1);
}
@Test
public void nextValueTests4() {
addObjectsToMapTest();
object1 = testIndex.next("4");
Assert.assertNull("Value that should not exist is there.", object1);
}
@Test
public void putValueTest1() {
performPutValueTest("4", "1", "4", 4);
}
@Test
public void putValueTest2() {
performPutValueTest("0", "0", "3", 4);;
}
@Test
public void putValueTest3() {
performPutValueTest("1", "1", "3", 3);
}
@Test
public void putValueTest4() {
performPutValueTest("1a", "1", "3", 4);
}
private void performPutValueTest(String key, String firstKey, String lastKey, int size) {
addObjectsToMapTest();
TestObject testObject = Assertions.createTestObject(4);
object1 = testIndex.exact("1");
object1.getRegularContents().add(testObject);
testIndex.put(key, testObject);
model.save(null);
reinitializeModel();
testIndex = assertTestIndex(0);
assertIndex(testIndex, firstKey, lastKey);
assertObject(testIndex.exact(key));
assertIterator(testIndex.iterator(), size);
assertFragmentsIndex();
assertIdIndex(true);
model.assertIndexClassIndex(testIndex, firstKey, lastKey, StringKeyType.instance);
}
protected void assertIterator(Iterator<TestObject> iterator, int size) {
Assert.assertTrue("Iterator is emtpy.", iterator.hasNext() || size == 0);
int i = 0;
while (iterator.hasNext()) {
assertObject(iterator.next());
i++;
}
Assert.assertEquals("Iterator has the wrong size.", size, i);
}
@SuppressWarnings("unchecked")
protected IndexedMap<String,TestObject> assertTestIndex(int index) {
Assert.assertTrue(root.getContents().size() > index);
Assert.assertTrue(root.getContents().get(index) instanceof IndexedMap);
IndexedMap<String,TestObject> contents = (IndexedMap<String,TestObject>) root.getContents().get(index);
Assert.assertTrue(((FObjectImpl)contents).fInternalObject().eResource() instanceof Fragment);
return contents;
}
protected void assertObject(Object value) {
Assert.assertNotNull("Value is null.", value);
Assert.assertTrue("Value has wrong type.", value instanceof TestObject);
Assert.assertTrue("Value is broken", ((TestObject)value).getName().startsWith("testValue"));
}
protected void assertIndexedObject(IndexedMap<String, TestObject> index, String key) {
TestObject value = index.exact(key);
assertObject(value);
}
protected void assertIndex(IndexedMap<String, TestObject> index, String firstKey, String lastKey) {
Assert.assertNotNull("Index is null.", index);
Assert.assertEquals("Wrong first key.", firstKey, index.getFirstKey());
Assert.assertEquals("Wrong last key.", lastKey, index.getLastKey());
}
}