2012-08-30 35 views
7

Todavía soy un novato en EMF, así que tal vez mi pregunta realmente no tenga sentido o asuma cosas equivocadas.¿Cómo comparar la igualdad entre EObject cuando contenían EList desordenado?

Estoy trabajando en un proyecto basado en modelos, por lo que definí un metamodelo ecore y generé el código asociado. Ahora estoy tratando de hacer pruebas unitarias y necesito poder probar la igualdad entre objetos y más particularmente entre objetos que extienden EObject.

Intenté usar EcoreUtil.equals() para realizar mis pruebas, pero siempre devuelve falso ya que mis objetos contienen referencias en las listas (clase EList) que no están ordenadas de la misma manera. Sin embargo, definí explícitamente en mi metamodelo que las referencias no están ordenadas: quiero usarlas más como Set que List.

Por lo tanto, finalmente decidí implementar mis propios métodos iguales en mi genereated * Impl Class, incluso si se desaconseja en el javadoc, pero hay otra manera, más elegante, de probar la igualdad estructural entre los objetos EMF sin tener en cuenta el orden de las listas?

Gracias!

Respuesta

2

Puede implementar su propia clase de utilidades donde codifique su propia comparación para listas desordenadas utilizando el método EObject igual a predeterminado.

Puede basar su implementación en el EqualityHelper.equals(List list1, List list2) usando la lista "contiene" en lugar de ir por índice como lo hace ese método.

0

I escribió los siguientes métodos de utilidad en Xtend:

static def boolean equalsTo(Set<? extends EObject> eObjectSet1, Set<? extends EObject> eObjectSet2) { 
    contains(eObjectSet1, eObjectSet2) && contains(eObjectSet2, eObjectSet1) 
} 

static def boolean contains(Set<? extends EObject> eObjectSet1, Set<? extends EObject> eObjectSet2) { 
    eObjectSet1.forall[eObject1 | eObjectSet2.exists[eObject2 | EcoreUtil.equals(eObject1, eObject2)]] 
} 
+0

No sé Xtend, pero a mí me parece que la línea de este código no tiene en cuenta los elementos duplicados en las listas. Entonces '[1]' y '[1, 1, 1]' serán reportados como iguales. – Lii

0

Esto probablemente podría resolverse mediante el uso de un EMap, con el elemento de la antigua lista como la llave y otro tipo arbitrario, por ejemplo EString, como valor

Si un elemento debe estar en el conjunto, asócielo a la cadena vacía.

EMap<SomeClass, EString> someSet; 

Si la lista puede contener elementos múltiples, correlacione con un número entero que proporcione el número de elementos.

Cuestiones relacionadas