--- a
+++ b/tests/limma/test_dups.py
@@ -0,0 +1,48 @@
+import unittest
+
+import numpy as np
+
+from inmoose.limma import uniquegenelist, unwrapdups
+
+
+class Test(unittest.TestCase):
+    def test_unwrapdups(self):
+        M = np.arange(12).reshape((4, 3))
+        self.assertTrue(np.array_equal(unwrapdups(M, ndups=1), M))
+        self.assertTrue(np.array_equal(unwrapdups(M, ndups=1, spacing=2), M))
+        self.assertTrue(
+            np.array_equal(unwrapdups(M), [[0, 3, 1, 4, 2, 5], [6, 9, 7, 10, 8, 11]])
+        )
+        self.assertTrue(
+            np.array_equal(
+                unwrapdups(M, ndups=4), [[0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11]]
+            )
+        )
+        self.assertTrue(
+            np.array_equal(
+                unwrapdups(M, ndups=2, spacing=2),
+                [[0, 6, 1, 7, 2, 8], [3, 9, 4, 10, 5, 11]],
+            )
+        )
+
+    def test_uniquegenelist(self):
+        M = np.arange(12).reshape((4, 3))
+        self.assertTrue(np.array_equal(uniquegenelist(M, ndups=1), M))
+        self.assertTrue(np.array_equal(uniquegenelist(M, ndups=1, spacing=2), M))
+        self.assertTrue(np.array_equal(uniquegenelist(M), [[0, 1, 2], [6, 7, 8]]))
+        self.assertTrue(np.array_equal(uniquegenelist(M, ndups=4), [[0, 1, 2]]))
+        self.assertTrue(
+            np.array_equal(
+                uniquegenelist(M, ndups=2, spacing=2), [[0, 1, 2], [3, 4, 5]]
+            )
+        )
+
+        M = np.arange(6)
+        self.assertTrue(np.array_equal(uniquegenelist(M, ndups=1), M))
+        self.assertTrue(np.array_equal(uniquegenelist(M, ndups=1, spacing=2), M))
+        self.assertTrue(np.array_equal(uniquegenelist(M), [0, 2, 4]))
+        self.assertTrue(np.array_equal(uniquegenelist(M, ndups=3), [0, 3]))
+        self.assertTrue(np.array_equal(uniquegenelist(M, ndups=3, spacing=2), [0, 1]))
+        self.assertTrue(
+            np.array_equal(uniquegenelist(M, ndups=2, spacing=3), [0, 1, 2])
+        )