From cadaee22c3bc7eab1431cb46c61aa7b0a7738be0 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 16 Jan 2019 16:17:12 +0100
Subject: [PATCH] list comparator implemeted

---
 .../common/comparator/ListComparator.java     | 50 +++++++++++++++
 .../common/comparator/AllComparatorTests.java |  1 +
 .../common/comparator/ListComparatorTest.java | 64 +++++++++++++++++++
 3 files changed, 115 insertions(+)
 create mode 100644 commons/src/main/java/lcsb/mapviewer/common/comparator/ListComparator.java
 create mode 100644 commons/src/test/java/lcsb/mapviewer/common/comparator/ListComparatorTest.java

diff --git a/commons/src/main/java/lcsb/mapviewer/common/comparator/ListComparator.java b/commons/src/main/java/lcsb/mapviewer/common/comparator/ListComparator.java
new file mode 100644
index 0000000000..1d7334ca26
--- /dev/null
+++ b/commons/src/main/java/lcsb/mapviewer/common/comparator/ListComparator.java
@@ -0,0 +1,50 @@
+package lcsb.mapviewer.common.comparator;
+
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Comparator used for comparing lists of objects.
+ * 
+ * @author Piotr Gawron
+ * 
+ */
+public class ListComparator<T> implements Comparator<List<T>> {
+  /**
+   * Default class logger.
+   */
+  @SuppressWarnings("unused")
+  private Logger logger = Logger.getLogger(ListComparator.class);
+
+  private Comparator<T> objectComparator;
+
+  public ListComparator(Comparator<T> objectComparator) {
+    this.objectComparator = objectComparator;
+  }
+
+  @Override
+  public int compare(List<T> arg0, List<T> arg1) {
+    if (arg0 == null) {
+      if (arg1 == null) {
+        return 0;
+      } else {
+        return 1;
+      }
+    } else if (arg1 == null) {
+      return -1;
+    }
+
+    if (arg0.size() != arg1.size()) {
+      return new IntegerComparator().compare(arg0.size(), arg1.size());
+    }
+    for (int i = 0; i < arg0.size(); i++) {
+      if (objectComparator.compare(arg0.get(i), arg1.get(i)) != 0) {
+        return objectComparator.compare(arg0.get(i), arg1.get(i));
+      }
+    }
+    return 0;
+  }
+
+}
diff --git a/commons/src/test/java/lcsb/mapviewer/common/comparator/AllComparatorTests.java b/commons/src/test/java/lcsb/mapviewer/common/comparator/AllComparatorTests.java
index 16d18b9814..7dbfdf2a60 100644
--- a/commons/src/test/java/lcsb/mapviewer/common/comparator/AllComparatorTests.java
+++ b/commons/src/test/java/lcsb/mapviewer/common/comparator/AllComparatorTests.java
@@ -10,6 +10,7 @@ import org.junit.runners.Suite.SuiteClasses;
     DoubleComparatorTest.class,
     EnumComparatorTest.class,
     IntegerComparatorTest.class,
+    ListComparatorTest.class,
     PointComparatorTest.class,
     StringComparatorTest.class,
     StringListComparatorTest.class,
diff --git a/commons/src/test/java/lcsb/mapviewer/common/comparator/ListComparatorTest.java b/commons/src/test/java/lcsb/mapviewer/common/comparator/ListComparatorTest.java
new file mode 100644
index 0000000000..b7e6912654
--- /dev/null
+++ b/commons/src/test/java/lcsb/mapviewer/common/comparator/ListComparatorTest.java
@@ -0,0 +1,64 @@
+package lcsb.mapviewer.common.comparator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import org.junit.Test;
+
+public class ListComparatorTest {
+
+  @Test
+  public void testEqual() {
+    List<Color> set1 = new ArrayList<>();
+    List<Color> set2 = new ArrayList<>();
+    set1.add(Color.BLACK);
+    set2.add(Color.BLACK);
+    ListComparator<Color> comparator = new ListComparator<>(new ColorComparator());
+    assertEquals(0, comparator.compare(set1, set2));
+  }
+
+  @Test
+  public void testDifferent() {
+    List<Color> set1 = new ArrayList<>();
+    List<Color> set2 = new ArrayList<>();
+    set1.add(Color.BLACK);
+    set2.add(Color.BLUE);
+    ListComparator<Color> comparator = new ListComparator<>(new ColorComparator());
+    assertTrue(comparator.compare(set1, set2) != 0);
+  }
+
+  @Test
+  public void testEqualWithCustomClass() {
+    class Data {
+      int x;
+
+      Data(int x) {
+        this.x = x;
+      }
+    }
+    class DataComparator implements Comparator<Data> {
+      @Override
+      public int compare(Data o1, Data o2) {
+        return o1.x - o2.x;
+      }
+    }
+
+    List<Data> set1 = new ArrayList<>();
+    List<Data> set2 = new ArrayList<>();
+    set1.add(new Data(1));
+    set2.add(new Data(1));
+
+    ListComparator<Data> comparator = new ListComparator<>(new DataComparator());
+    assertEquals(0, comparator.compare(set1, set2));
+
+    set2.add(new Data(2));
+    assertTrue(0 != comparator.compare(set1, set2));
+    assertTrue(0 != comparator.compare(set2, set1));
+  }
+
+}
-- 
GitLab