/**
* Copyright (c) 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.test.edit.provider;
import java.util.Collection;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
/**
* A test case that demonstrates how getReachableObjectsOfType works.
* This test case looks for different objects that are reachable
* in the graph given their type. The test case uses a large
* dataset and demonstrates BUG #161744;
* @author Ian Bull
*/
public class TypeSearchTest extends TestCase
{
public TypeSearchTest(String name)
{
super(name);
}
public static Test suite()
{
TestSuite suite = new TestSuite("TypeSearchTest");
suite.addTest(new TypeSearchTest("testFindFirstObject"));
suite.addTest(new TypeSearchTest("testFindLastObject"));
suite.addTest(new TypeSearchTest("testFindMultiType"));
suite.addTest(new TypeSearchTest("testFindMultiType2"));
suite.addTest(new TypeSearchTest("testFindNoType"));
suite.addTest(new TypeSearchTest("testFindSingleType"));
suite.addTest(new TypeSearchTest("testFindWithSuperTypes"));
return suite;
}
public static final int DATASETSIZE = 10000;
EClass poClass = null;
EClass itemClass = null;
EClass otherClass = null;
EClass firstClass = null;
EClass lastClass = null;
EClass superClass = null;
EReference next = null;
EReference item = null;
EReference otherReference = null;
EReference lastReference = null;
EReference first2second = null;
EObject firstObject = null;
EObject otherItemObject = null;
EObject lastObject = null;
/**
* Creates the EClasses for the test case.
*/
private void createEClasses()
{
EPackage poPackage = EcoreFactory.eINSTANCE.createEPackage();
superClass = EcoreFactory.eINSTANCE.createEClass();
poClass = EcoreFactory.eINSTANCE.createEClass();
itemClass = EcoreFactory.eINSTANCE.createEClass();
otherClass = EcoreFactory.eINSTANCE.createEClass();
firstClass = EcoreFactory.eINSTANCE.createEClass();
lastClass = EcoreFactory.eINSTANCE.createEClass();
poClass.getESuperTypes().add(superClass);
itemClass.getESuperTypes().add(superClass);
poPackage.getEClassifiers().add(superClass);
poPackage.getEClassifiers().add(poClass);
poPackage.getEClassifiers().add(itemClass);
poPackage.getEClassifiers().add(otherClass);
poPackage.getEClassifiers().add(firstClass);
poPackage.getEClassifiers().add(lastClass);
}
/**
* Creates the EReferences for the test case.
*/
private void createEReferences()
{
first2second = EcoreFactory.eINSTANCE.createEReference();
first2second.setName("first2second");
first2second.setEType(poClass);
firstClass.getEStructuralFeatures().add(first2second);
next = EcoreFactory.eINSTANCE.createEReference();
next.setName("next");
next.setEType(poClass);
poClass.getEStructuralFeatures().add(next);
item = EcoreFactory.eINSTANCE.createEReference();
item.setName("item");
item.setEType(itemClass);
poClass.getEStructuralFeatures().add(item);
otherReference = EcoreFactory.eINSTANCE.createEReference();
otherReference.setName("other");
otherReference.setEType(otherClass);
itemClass.getEStructuralFeatures().add(otherReference);
lastReference = EcoreFactory.eINSTANCE.createEReference();
lastReference.setName("lastReference");
lastReference.setEType(lastClass);
poClass.getEStructuralFeatures().add(lastReference);
}
/**
* Create the data for the test case.
* This creates 3501 poClasses, 350 item classes and a single otherClass
*
*/
private void createInstanceData()
{
firstObject = EcoreUtil.create(firstClass);
EObject currentObject = EcoreUtil.create(poClass);
firstObject.eSet(first2second, currentObject);
for (int i = 0; i < DATASETSIZE - 1; i++)
{
EObject nextObject = EcoreUtil.create(poClass);
currentObject.eSet(next, nextObject);
if (i % 10 == 0)
{
EObject itemObject = EcoreUtil.create(itemClass);
currentObject.eSet(item, itemObject);
if (i == 2000)
{
otherItemObject = EcoreUtil.create(otherClass);
itemObject.eSet(otherReference, otherItemObject);
}
}
currentObject = nextObject;
}
lastObject = EcoreUtil.create(lastClass);
currentObject.eSet(lastReference, lastObject);
}
/**
* Setup the test case
*/
@Override
protected void setUp() throws Exception
{
createEClasses();
createEReferences();
createInstanceData();
}
/**
* See if we can find the 3501 po Objects
* @throws Exception
*/
public void testFindMultiType() throws Exception
{
Collection<EObject> orders = ItemPropertyDescriptor.getReachableObjectsOfType(firstObject, poClass);
assertEquals(orders.size(), DATASETSIZE);
}
/**
* See if we can find the 350 item Objects
* @throws Exception
*/
public void testFindMultiType2() throws Exception
{
Collection<EObject> items = ItemPropertyDescriptor.getReachableObjectsOfType(firstObject, itemClass);
assertEquals(items.size(), DATASETSIZE / 10);
}
/**
* This test cases tests the reachable objects using their supertype. Both the po objects and the
* items were of type "superClass".
* @throws Exception
*/
public void testFindWithSuperTypes() throws Exception
{
Collection<EObject> c = ItemPropertyDescriptor.getReachableObjectsOfType(firstObject, superClass);
assertEquals(c.size(), DATASETSIZE + (DATASETSIZE / 10));
}
/**
* See if we can find the 1 otherObject
* @throws Exception
*/
public void testFindSingleType() throws Exception
{
List<EObject> others = (List<EObject>)ItemPropertyDescriptor.getReachableObjectsOfType(firstObject, otherClass);
assertEquals(others.size(), 1);
assertEquals(others.get(0), otherItemObject);
}
/**
* Starting from the otherObject we can't get anywhere. See if this works.
* i.e. we should get no po objects from here!
* @throws Exception
*/
public void testFindNoType() throws Exception
{
Collection<EObject> others = ItemPropertyDescriptor.getReachableObjectsOfType(otherItemObject, poClass);
assertEquals(others.size(), 0);
}
/**
* Looks to see if it can find the first node in the list. The first node
* was a different type, so it should be found if we search by type.
* @throws Exception
*/
public void testFindFirstObject() throws Exception
{
List<EObject> c = (List<EObject>)ItemPropertyDescriptor.getReachableObjectsOfType(firstObject, firstClass);
assertEquals(c.size(), 1);
assertEquals(c.get(0), firstObject);
}
/**
* Looks to see if it can find the last node in the list. The last node
* was a different type, so it should be found if we search by type.
* @throws Exception
*/
public void testFindLastObject() throws Exception
{
List<EObject> c = (List<EObject>)ItemPropertyDescriptor.getReachableObjectsOfType(firstObject, lastClass);
assertEquals(c.size(), 1);
assertEquals(c.get(0), lastObject);
}
}