[479446] Excluding does not remove all occurrences of an element

1- Fix an issue with exluding and duplicates in a sequence
2- Fix an issue with including a duplicate in a sequence

Bug #479446
Change-Id: Id6a690c10c0bdcc9acb29eb9bef28c1dadb86c69
Signed-off-by: sbegaudeau <stephane.begaudeau@obeo.fr>
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/CollectionServices.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/CollectionServices.java
index 69410d8..94fcba9 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/CollectionServices.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/CollectionServices.java
@@ -1374,13 +1374,9 @@
 	)
 	// @formatter:on
 	public List<Object> including(List<Object> sequence, Object object) {
-		if (sequence.contains(object)) {
-			return sequence;
-		} else {
-			List<Object> result = Lists.newArrayList(sequence);
-			result.add(object);
-			return result;
-		}
+		List<Object> result = Lists.newArrayList(sequence);
+		result.add(object);
+		return result;
 	}
 
 	// @formatter:off
@@ -1401,7 +1397,7 @@
 			return sequence;
 		} else {
 			List<Object> result = Lists.newArrayList(sequence);
-			result.remove(object);
+			result.removeAll(Collections.singleton(object));
 			return result;
 		}
 	}
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesTest.java
index 008a8b9..ef744c6 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesTest.java
@@ -486,17 +486,19 @@
 	public void testIncluding() {
 		List<Object> list = Lists.newArrayList();
 		Object elt = new Object();
-		Object elt2 = new Object();
 		list.add(elt);
+
+		Object elt2 = new Object();
 		List<Object> result = collectionServices.including(list, elt2);
 		assertTrue(result.contains(elt2));
 		assertTrue(result.contains(elt));
 		assertEquals(2, result.size());
 
 		result = collectionServices.including(list, elt);
-		assertEquals(list, result);
+		assertEquals(2, result.size());
 		assertTrue(result.contains(elt));
-		assertEquals(1, result.size());
+		assertEquals(result.get(0), elt);
+		assertEquals(result.get(1), elt);
 	}
 
 	@Test
@@ -520,6 +522,30 @@
 	}
 
 	@Test
+	public void testExcludingWithDuplicates() {
+		List<Object> list = new ArrayList<Object>();
+		String a = "a";
+		String b = "b";
+		String c = "c";
+
+		list.add(a);
+		list.add(b);
+		list.add(c);
+		list.add(b);
+
+		List<Object> result = collectionServices.excluding(list, b);
+		assertTrue(result.contains(a));
+		assertTrue(result.contains(c));
+		assertFalse(result.contains(b));
+
+		assertEquals(2, result.size());
+
+		assertEquals(0, result.indexOf(a));
+		assertEquals(1, result.indexOf(c));
+
+	}
+
+	@Test
 	public void testReverse() {
 		List<Object> list = Lists.newArrayList();
 		assertEquals(0, collectionServices.reverse(list).size());