--- a
+++ b/tests/test_ops.py
@@ -0,0 +1,167 @@
+import os
+import unittest
+from common import run_tests
+
+import ants
+
+import numpy as np
+import numpy.testing as nptest
+
+
+class Test_iMath(unittest.TestCase):
+    
+    
+    def setUp(self):
+        pass
+    
+    def tearDown(self):
+        pass
+    
+    def test_functions(self):
+        image = ants.image_read(ants.get_data('r16'))
+        ants.iMath_canny(image, sigma=2, lower=0, upper=1)
+        ants.iMath_fill_holes(image, hole_type=2)
+        ants.iMath_GC(image, radius=1)
+        ants.iMath_GD(image, radius=1)
+        ants.iMath_GE(image, radius=1)
+        ants.iMath_GO(image, radius=1)
+        ants.iMath_get_largest_component(image, min_size=50)
+        ants.iMath_grad(image, sigma=0.5, normalize=False)
+        ants.iMath_histogram_equalization(image, alpha=0.5, beta=0.5)
+        ants.iMath_laplacian(image, sigma=0.5, normalize=False)
+        ants.iMath_MC(image, radius=1, value=1, shape=1, parametric=False, lines=3, thickness=1, include_center=False)
+        ants.iMath_MD(image, radius=1, value=1, shape=1, parametric=False, lines=3, thickness=1, include_center=False)
+        ants.iMath_ME(image, radius=1, value=1, shape=1, parametric=False, lines=3, thickness=1, include_center=False)
+        ants.iMath_MO(image, radius=1, value=1, shape=1, parametric=False, lines=3, thickness=1, include_center=False)
+        ants.iMath_maurer_distance(image, foreground=1)
+        ants.iMath_normalize(image)
+        ants.iMath_pad(image, padding=2)
+        ants.iMath_perona_malik(image, conductance=0.25, n_iterations=1)
+        ants.iMath_sharpen(image)
+        ants.iMath_truncate_intensity(image, lower_q=0.05, upper_q=0.95, n_bins=64)
+    
+    
+class Test_slice_image(unittest.TestCase):
+    """
+    Test ants.ANTsImage class
+    """
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        pass
+
+    def test_slice_image_2d(self):
+        """
+        Test that resampling an image doesnt cause the resampled
+        image to have NaNs - previously caused by resampling an
+        image of type DOUBLE
+        """
+        img = ants.image_read(ants.get_ants_data('r16'))
+        
+        img2 = ants.slice_image(img, 0, 100)
+        self.assertTrue(isinstance(img2, np.ndarray))
+        
+        img2 = ants.slice_image(img, 1, 100)
+        self.assertTrue(isinstance(img2, np.ndarray))
+        
+        with self.assertRaises(Exception):
+            img2 = ants.slice_image(img, 2, 100)
+            
+        with self.assertRaises(Exception):
+            img2 = ants.slice_image(img, -3, 100)
+        
+        with self.assertRaises(Exception):
+            img2 = ants.slice_image(img, 4, 100)
+            
+        img2 = ants.slice_image(img, -1, 100)
+        img3 = ants.slice_image(img, 1, 100)
+        self.assertTrue(np.allclose(img2, img3))
+
+    def test_slice_image_2d_vector(self):
+        img0 = ants.image_read(ants.get_ants_data('r16'))
+        img = ants.merge_channels([img0,img0,img0])
+
+        img2 = ants.slice_image(img, 0, 100)
+        self.assertTrue(isinstance(img2, np.ndarray))
+        
+        img2 = ants.slice_image(img, 1, 100)
+        self.assertTrue(isinstance(img2, np.ndarray))
+        
+        with self.assertRaises(Exception):
+            img2 = ants.slice_image(img, 2, 100)
+            
+        with self.assertRaises(Exception):
+            img2 = ants.slice_image(img, -3, 100)
+        
+        with self.assertRaises(Exception):
+            img2 = ants.slice_image(img, 4, 100)
+            
+        img2 = ants.slice_image(img, -1, 100)
+        img3 = ants.slice_image(img, 1, 100)
+        self.assertTrue(np.allclose(img2, img3))
+
+    def test_slice_image_3d(self):
+        """
+        Test that resampling an image doesnt cause the resampled
+        image to have NaNs - previously caused by resampling an
+        image of type DOUBLE
+        """
+        img = ants.image_read(ants.get_ants_data('mni'))
+        
+        img2 = ants.slice_image(img, 0, 100)
+        self.assertEqual(img2.dimension, 2)
+        
+        img2 = ants.slice_image(img, 1, 100)
+        self.assertEqual(img2.dimension, 2)
+        
+        img2 = ants.slice_image(img, 2, 100)
+        self.assertEqual(img2.dimension, 2)
+        
+        img2 = ants.slice_image(img.clone('unsigned int'), 2, 100)
+        self.assertEqual(img2.dimension, 2)
+        
+        with self.assertRaises(Exception):
+            img2 = ants.slice_image(img, 3, 100)
+            
+        with self.assertRaises(Exception):
+            img2 = ants.slice_image(img, 2, 100, collapse_strategy=23)
+            
+        img2 = ants.slice_image(img, -1, 100)
+        img3 = ants.slice_image(img, 2, 100)
+        self.assertTrue(ants.allclose(img2, img3))
+
+    def test_slice_image_3d_vector(self):
+        """
+        Test that resampling an image doesnt cause the resampled
+        image to have NaNs - previously caused by resampling an
+        image of type DOUBLE
+        """
+        img0 = ants.image_read(ants.get_ants_data('mni'))
+        img = ants.merge_channels([img0,img0,img0])
+        
+        img2 = ants.slice_image(img, 0, 100)
+        self.assertEqual(img2.dimension, 2)
+        
+        img2 = ants.slice_image(img, 1, 100)
+        self.assertEqual(img2.dimension, 2)
+        
+        img2 = ants.slice_image(img, 2, 100)
+        self.assertEqual(img2.dimension, 2)
+        
+        img2 = ants.slice_image(img.clone('unsigned int'), 2, 100)
+        self.assertEqual(img2.dimension, 2)
+        
+        with self.assertRaises(Exception):
+            img2 = ants.slice_image(img, 3, 100)
+            
+        with self.assertRaises(Exception):
+            img2 = ants.slice_image(img, 2, 100, collapse_strategy=23)
+            
+        img2 = ants.slice_image(img, -1, 100)
+        img3 = ants.slice_image(img, 2, 100)
+        self.assertTrue(ants.allclose(img2, img3))
+
+
+if __name__ == '__main__':
+    run_tests()