2012-08-30 15 views
7

Sono ancora un principiante in EMF quindi forse la mia domanda non ha molto senso o presumo cose sbagliate.Come confrontare l'uguaglianza tra EObject quando conteneva EList non ordinato?

Sto lavorando a un progetto guidato dal modello, quindi ho definito un ecametodelmodello e generato il codice associato. Ora sto cercando di fare test unitari e devo essere in grado di testare l'uguaglianza tra gli oggetti e, in particolare, tra gli oggetti che estendono EObject.

Ho provato a utilizzare EcoreUtil.equals() per eseguire i test ma restituisce sempre false poiché i miei oggetti contengono riferimenti in elenchi (classe EList) che non sono ordinati allo stesso modo. Tuttavia, ho definito esplicitamente nel mio metamodel che i riferimenti non sono ordinati: voglio usarli più come Set che List.

Così, alla fine ho deciso di implementare i miei metodi di equità nella mia classe Impl generata *, anche se scoraggiata nella javadoc, ma in un altro modo, più elegante, per testare l'uguaglianza strutturale tra gli oggetti EMF senza prendere in conta l'ordine delle liste?

Grazie!

risposta

2

È possibile implementare la propria classe di utilità in cui si codifica il proprio confronto per gli elenchi non ordinati utilizzando il metodo EObject predefinito.

È possibile basare la propria implementazione nello EqualityHelper.equals(List list1, List list2) utilizzando la lista "contains" invece di andare per indice come fa quel metodo.

0

ho scritto i seguenti metodi di utilità nella 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

Non conosco Xtend, ma a me sembra linea questo codice non tiene in considerazione gli elementi duplicati negli elenchi. Quindi '[1]' e '[1, 1, 1]' saranno riportati come uguali. – Lii

0

Questo potrebbe probabilmente essere risolto utilizzando un EMap, con l'elemento del primo elenco come chiave e un altro tipo arbitrario, per esempio EString, come valore.

Se un elemento deve essere nell'insieme, mapparlo sulla stringa vuota.

EMap<SomeClass, EString> someSet; 

Se l'elenco può contenere più elementi, mapparlo e numero intero che fornisce il numero di elementi.