From e7ceb45e242961e905d67afde6670d5de139add6 Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauld.mccarthy@gmail.com>
Date: Tue, 28 Jun 2016 16:13:56 +0100
Subject: [PATCH] Test case for collapseExpansions

---
 test/test_imagewrapper.py | 100 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 95 insertions(+), 5 deletions(-)

diff --git a/test/test_imagewrapper.py b/test/test_imagewrapper.py
index 94aad7959..b2f5279e0 100644
--- a/test/test_imagewrapper.py
+++ b/test/test_imagewrapper.py
@@ -61,13 +61,17 @@ def random_coverage(shape, vol_limit=None):
 
 def random_slices(coverage, shape, mode):
 
-    ndims = len(shape) - 1
-    nvols = shape[-1]
-    
-    slices = np.zeros((2, len(shape)))
-
+    shape    = np.array(shape)
+    ndims    = len(shape) - 1
+    nvols    = shape[-1]
+    slices   = np.zeros((2, len(shape)))
     origMode = mode
 
+    if coverage is None:
+        coverage          = np.zeros((2, ndims, nvols), dtype=np.float32)
+        coverage[0, :, :] = 0
+        coverage[1, :, :] = shape[:-1].reshape(ndims, 1).repeat(nvols, 1)
+
     # If we're generating an 'out' slice (i.e.
     # a slice which is not covered by the coverage),
     # then only one dimension needs to be out. The
@@ -917,3 +921,89 @@ def test_ImageWrapper_write_different_volume(niters=150):
                     
                 assert np.isclose(newLo, elo)
                 assert np.isclose(newHi, ehi)
+
+
+def test_collapseExpansions(niters=500):
+
+    def expEq(exp1, exp2):
+        
+        if len(exp1) != len(exp2):
+            return False
+        
+        for (e1lo, e1hi), (e2lo, e2hi) in zip(exp1, exp2):
+            if e1lo != e2lo: return False
+            if e1hi != e2hi: return False
+        return True
+
+    def rangesOverlapOrAdjacent(r1, r2):
+
+        r1lo, r1hi = r1
+        r2lo, r2hi = r2
+
+        return not ((r1lo > r2hi) or (r1hi < r2lo) or \
+                    (r2lo > r1hi) or (r2hi < r1lo))
+
+    for i in range(niters):
+
+        # Generate a random coverage shape
+        ndims     = random.choice((2, 3, 4)) - 1
+        nvols     = np.random.randint(10, 40)
+        shape     = np.random.randint(5, 60, size=ndims + 1)
+        shape[-1] = nvols
+
+        # Generate a bunch of random slices, and
+        # split each of them up by volume to
+        # turn them each into a set of expansions
+        exps     = []
+        expected = []
+
+        for i in range(10):
+
+            # Generate a random slice with a volume
+            # range that doesn't overlap with, and
+            # is not adjacent to, any of the other
+            # generated random slices.
+            #
+            # The only reason I'm doing this is to
+            # overocme a chicken-and-egg problem -
+            # if I want to test overlapping/adjacent
+            # region, I basically have to
+            # re-implement the collapseExpansions
+            # function.
+            while True:
+                slices = random_slices(None, shape, 'in')
+                vlo, vhi = slices[-1]
+
+                for exp in expected:
+
+                    if not expEq(exp[:-1], slices[:-1]):
+                        continue
+                    
+                    evlo, evhi = exp[-1]
+
+                    # Overlap
+                    if rangesOverlapOrAdjacent((vlo, vhi), (evlo, evhi)):
+                        break
+                else:
+                    break
+
+            expected.append(slices)
+
+            for vol in range(slices[-1][0], slices[-1][1]):
+
+                exp = tuple(list(slices[:-1]) + [(vol, vol + 1)])
+                exps.append(exp)
+
+        # Now shuffle them up randomly
+        np.random.shuffle(exps)
+
+        # And attempt to collapse them
+        collapsed = imagewrap.collapseExpansions(exps, ndims)
+
+        collapsed = sorted(collapsed)
+        expected  = sorted(expected)
+
+        assert len(expected) == len(collapsed)
+
+        for exp, col in zip(expected, collapsed):
+            assert expEq(exp, col)
-- 
GitLab