package de.hub.emffrag.fragmentation; import junit.framework.Assert; import org.eclipse.emf.common.util.EList; import org.junit.Test; import de.hub.emffrag.testmodels.testmodel.TestObject; import de.hub.emffrag.testmodels.testmodel.TestObjectWithIndexes; import de.hub.emffrag.testmodels.testmodel.frag.meta.TestModelFactory; public class CacheTests extends AbstractFragmentationTests { @Override protected boolean doInitializeModel() { return false; } private void initializeModel(int cacheSize) { model = createFragmentedModel(dataStore, cacheSize, metaModel); root = model.root(); } @Test public void testUnloading() throws Exception { initializeModel(4); model.root().getContents().add(object1); object1.getFragmentedContents().add(object2); object2.getFragmentedContents().add(object3); object3.getFragmentedContents().add(object4); FInternalObjectImpl iObject2 = ((FObjectImpl)object2).fInternalObject(); FInternalObjectImpl iObject3 = ((FObjectImpl)object3).fInternalObject(); Assert.assertNotNull(model.getFragment(iObject2.eResource().getURI())); Assert.assertNotNull(model.getFragment(iObject3.eResource().getURI())); model.assertNumberOfLoadedFragments(4); Assertions.root(model).assertId(1).getFragmentedContents().assertSize(1).get(0).getFragmentedContents().assertSize(1).get(0).assertId(3); } @Test public void testAutomatedUnloadingNestedFragments() throws Exception { initializeModel(5); model.root().getContents().add(object1); for (int i = 0; i < 100; i++) { object2 = TestModelFactory.eINSTANCE.createTestObject(); object2.setName("testValue" + i); object1.getFragmentedContents().add(object2); object1 = object2; model.assertNumberOfLoadedFragments(0, 10); } model.assertMaxFragmentsIndexSize(102l); model.assertStatistics(0, 10, 0, 5, 90, 103, 100, 103); } @Test public void testAutomatedUnloadingSequentialFragments() throws Exception { initializeModel(5); model.root().getContents().add(object1); for (int i = 0; i < 100; i++) { object2 = TestModelFactory.eINSTANCE.createTestObject(); object2.setName("testValue" + i); object1.getFragmentedContents().add(object2); model.assertNumberOfLoadedFragments(0, 10); } model.assertMaxFragmentsIndexSize(102l); // Before EMF adds a value to a list, it checks if this value is already // in that list. If the list is small (<4), it compare each element with // the added element and therefore has to resolve proxies if necessary. // This causes a few loads. model.assertStatistics(0, 10, 0, 6, 90, 110, 100, 103); } @Test public void testReloadOfUnloadedFragment() throws Exception { initializeModel(4); model.root().getContents().add(object1); object1.getFragmentedContents().add(object2); object2.getFragmentedContents().add(object3); object3.getFragmentedContents().add(object4); FInternalObjectImpl iObject2 = ((FObjectImpl)object2).fInternalObject(); FInternalObjectImpl iObject3 = ((FObjectImpl)object3).fInternalObject(); Assert.assertNotNull(model.getFragment(iObject2.eResource().getURI())); Assert.assertNotNull(model.getFragment(iObject3.eResource().getURI())); model.assertNumberOfLoadedFragments(4); Assertions .root(model).assertId(1) .getFragmentedContents().assertSize(1) .get(0).assertId(2).assertDifferentFragmentAsContainer() .getFragmentedContents().assertSize(1) .get(0).assertId(3).assertDifferentFragmentAsContainer(); model.assertStatistics(0, 4, 1, 5, 1, 5, 5, 5); } @Test public void testLastUsedCacheTest() throws Exception { initializeModel(5); model.root().getContents().add(object1); TestObject[] children = new TestObject[100]; for (int i = 0; i < 100; i++) { children[i] = TestModelFactory.eINSTANCE.createTestObject(); children[i].setName("testValue" + i); object1.getFragmentedContents().add(children[i]); } // use the first 10 objects, in reverse order, they should be removed // last in that reversed order for (int i = 9; i >= 0; i--) { children[i].getName(); } for (int i = 0; i < 100; i++) { children[i] = null; } model.assertStatistics(5, 10, -1, -1, 50, 200, -1, -1); // touch the first 5 objects and see if they were cached for (int i = 0; i < 5; i++) { Assert.assertEquals("testValue" + i, object1.getFragmentedContents().get(i).getName()); } model.assertStatistics(0, 5, 0, 5, -1, -1, -1, -1); // touch the next 5 objects and see if they were not cached for (int i = 5; i < 10; i++) { Assert.assertEquals("testValue" + i, object1.getFragmentedContents().get(i).getName()); } model.assertStatistics(0, 5, 5, 10, -1, -1, -1, -1); } @Test public void testArbitraryOperations() { initializeModel(5); TestObject container = addObject(null, false); model.root().getContents().add(container); TestObject contents = addObject(container, true); addObject(container, true); addObject(container, true); container = contents; contents = addObject(container, true); addObject(container, true); removeObject(contents); } @Test public void testRegularContainmentAfterReload() throws Exception { initializeModel(4); model.root().getContents().add(object1); object1.getFragmentedContents().add(object2); object2.getFragmentedContents().add(object3); object3.getFragmentedContents().add(object4); TestObject contents = Assertions.createTestObject(5); object4.getRegularContents().add(contents); model.assertNumberOfLoadedFragments(4); object4 = Assertions .root(model).assertId(1) .getFragmentedContents().assertSize(1) .get(0).assertId(2).assertDifferentFragmentAsContainer() .getFragmentedContents().assertSize(1) .get(0).assertId(3).assertDifferentFragmentAsContainer() .getFragmentedContents().assertSize(1) .get(0).assertId(4).assertDifferentFragmentAsContainer().value(); contents = Assertions.context(object4) .getRegularContents().assertSize(1) .get(0).assertId(5).assertSameFragmentAsContainer().value(); model.assertStatistics(0, 4, -1, -1, -1, -1, 5, 5); } @Test public void testUnloadingLoadingOfIndexedContainment() { initializeModel(5); TestObjectWithIndexes testObject = (TestObjectWithIndexes)Assertions.createTestObjectWithIndexes(0); root.getContents().add(testObject); EList<TestObject> valueSet = testObject.getIndexedContents(); for (int i = 0; i <= 4; i++) { TestObject innerTestObject = createTestObject(i); valueSet.add(innerTestObject); // causes it innerTestObject.getRegularContents().add(createTestObject(0)); for (TestObject o: valueSet) { Assertions.context(o).assertTestObject(); } } } }