class TestUserDataManager(unittest.TestCase):
    def setUp(self):
        self.manager = UserDataManager("test")

        self.generate_original_image()
        self.generate_patch()

    def generate_original_image(self):
        # save lena as the original image
        lena = data.lena()
        self.lena_path = os.path.join(root_user_data, "test",
                                      original_image_dirname, lena_filename)
        imsave(self.lena_path, lena)

    def generate_patch(self):
        # create patch
        patch = crop(data.lena(), (15, 15))
        self.lena_patch_path = os.path.join(root_user_data, "test",
                                            patch_dirname, lena_filename)
        imsave(self.lena_patch_path, patch)

    def test_add_patch(self):
        os.remove(self.lena_patch_path)
        self.manager.add_patch(self.lena_path, (10, 10))
        self.assertTrue(os.path.exists(self.lena_patch_path))

        # IndexError should be raised if the cropped range is out of
        # the source image
        lena = data.lena()
        self.assertRaises(IndexError,
                          self.manager.add_patch, self.lena_path, (10, 9))
        self.assertRaises(IndexError,
                          self.manager.add_patch, self.lena_path, (9, 10))
        self.assertRaises(IndexError,
                          self.manager.add_patch, self.lena_path,
                          (lena.shape[0]-10, lena.shape[0]-9))

    def test_basenames(self):
        self.assertEqual(self.manager.basenames(), [lena_filename])

    def test_patches(self):
        patches = self.manager.patches()
        n_patches = sum(1 for p in patches)
        self.assertEqual(n_patches, 1)  # only lena.jpg is saved
        for patch in patches:
            self.assertEqual(patch.shape, (patch_size, patch_size, 3))

    def test_has_valid_format(self):
        self.assertTrue(self.manager.has_valid_format())

        os.remove(self.lena_path)

        self.assertFalse(self.manager.has_valid_format())

        self.generate_patch()