2012-08-30 8 views
7

Wciąż jestem nowicjuszem w dziedzinie EMF, więc być może moje pytanie nie ma sensu, lub zakładam złe rzeczy.Jak porównać równość EObject, gdy zawierał nieuporządkowany EList?

Pracuję nad projektem opartym na modelu, dlatego zdefiniowałem metamodel ecore i wygenerowałem kod skojarzony. Obecnie próbuję wykonywać testy jednostkowe i potrzebuję możliwości przetestowania równości między obiektami, a dokładniej między obiektami, które rozszerzają EObject.

Próbowałem użyć EcoreUtil.equals(), aby wykonać moje testy, ale zawsze zwraca wartość false, ponieważ moje obiekty zawierają odniesienia na listach (klasa EList), które nie są zamawiane w ten sam sposób. Jednak w metamodelu wyraźnie zdefiniowałem, że referencje nie są uporządkowane: chcę używać ich bardziej jak Set niż List.

W końcu zdecydowałem się wdrożyć moje własne metody równości w mojej genereated * klasie Impl, nawet jeśli jest to zniechęcony w javadoc, ale jest tam inny sposób, bardziej elegancki, aby przetestować strukturalną równość obiektów EMF bez brania pod uwagę rozliczać kolejność list?

Dzięki!

Odpowiedz

2

Można zaimplementować własną klasę narzędzi, w której można zakodować własne porównanie dla nieuporządkowanych list za pomocą metody EObject default equals.

Możesz oprzeć swoją implementację na EqualityHelper.equals(List list1, List list2) używając listy "zawiera" zamiast przechodzenia przez indeks, jak ta metoda.

0

napisałem następujące metody eksploatacji w 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

Nie wiem Xtend, ale wydaje mi się, że ten kod nie bierze pod uwagę duplikowania elementów na listach. Tak więc "[1]" i "[1, 1, 1]" będą zgłaszane jako równe. – Lii

0

Można to prawdopodobnie rozwiązać stosując EMap, z elementem dawnego liście jako klucz i arbitralnego innego rodzaju, na przykład EString, jako wartość.

Jeśli element ma być w zestawie, zamapuj go na pusty ciąg.

EMap<SomeClass, EString> someSet; 

Jeśli lista może zawierać wiele elementów, zamapuj ją na liczbę całkowitą, która daje liczbę elementów.