Switch to side-by-side view

--- a
+++ b/tests/utils/test_factor.py
@@ -0,0 +1,57 @@
+import unittest
+
+import numpy as np
+
+from inmoose.utils import Factor, asfactor, gl
+
+
+class test_factor(unittest.TestCase):
+    def test_class(self):
+        f = Factor([1, 1, 2, 3, 3])
+        self.assertTrue(np.array_equal(f.__array__(), [1, 1, 2, 3, 3]))
+        self.assertTrue(np.array_equal(f.categories, [1, 2, 3]))
+
+        self.assertEqual(len(f), len(f.__array__()))
+        self.assertEqual(f.nlevels(), len(f.categories))
+
+        f = Factor([1, 3, 3])
+        g = f.droplevels()
+        self.assertTrue(np.array_equal(g.__array__(), [1, 3, 3]))
+        self.assertTrue(np.array_equal(g.categories, [1, 3]))
+
+    # def test_equality(self):
+    #    f1 = Factor([1,2,3,3])
+    #    f2 = Factor([1,2,2,3])
+    #    f3 = Factor([1,2,3,3])
+
+    #    self.assertTrue(f1 == f3)
+    #    self.assertTrue(f3 == f1)
+    #    self.assertFalse(f1 != f3)
+    #    self.assertFalse(f3 != f1)
+    #    self.assertFalse(f1 == f2)
+    #    self.assertFalse(f2 == f1)
+    #    self.assertTrue(f1 != f2)
+    #    self.assertTrue(f2 != f1)
+
+    #    self.assertFalse(f1 == 0)
+    #    self.assertFalse(0 == f1)
+    #    self.assertTrue(f1 != 0)
+    #    self.assertTrue(0 != f1)
+
+    def test_asfactor(self):
+        f = Factor([1, 2, 3, 3])
+        self.assertTrue(f is asfactor(f))
+        self.assertTrue(
+            np.array_equal(f.__array__(), asfactor([1, 2, 3, 3]).__array__())
+        )
+
+    def test_gl(self):
+        for n in range(1, 6):
+            for k in range(1, 6):
+                with self.subTest("test_gl_sub", n=n, k=k):
+                    f = gl(n, k)
+                    self.assertEqual(f.nlevels(), n)
+                    self.assertEqual(len(f), n * k)
+                    self.assertTrue((f.__array__() == np.sort(f.__array__())).all())
+                    for j in range(1, n + 1):
+                        self.assertEqual((f.__array__() == j).sum(), k)