class Test_calculate_difference(IrisTest):

    """Test the calculate_difference method."""

    def setUp(self):
        """Set up cube."""
        data = np.array([[1, 2, 3],
                         [2, 4, 6],
                         [5, 10, 15]])
        self.cube = set_up_cube(data, "wind_speed", "m s-1")
        self.plugin = DifferenceBetweenAdjacentGridSquares()

    def test_x_dimension(self):
        """Test differences calculated along the x dimension."""
        expected = np.array([[1, 1],
                             [2, 2],
                             [5, 5]])
        result = self.plugin.calculate_difference(self.cube, "x")
        self.assertIsInstance(result, Cube)
        self.assertArrayAlmostEqual(result.data, expected)

    def test_y_dimension(self):
        """Test differences calculated along the y dimension."""
        expected = np.array([[1, 2, 3],
                             [3, 6, 9]])
        result = self.plugin.calculate_difference(self.cube, "y")
        self.assertIsInstance(result, Cube)
        self.assertArrayAlmostEqual(result.data, expected)

    def test_missing_data(self):
        """Test that the result is as expected when data is missing."""
        data = np.array([[1, 2, 3],
                         [np.nan, 4, 6],
                         [5, 10, 15]])
        cube = set_up_cube(data, "wind_speed", "m s-1")
        expected = np.array([[np.nan, 2, 3],
                             [np.nan, 6, 9]])
        result = self.plugin.calculate_difference(cube, "y")
        self.assertIsInstance(result, Cube)
        self.assertArrayAlmostEqual(result.data, expected)

    def test_masked_data(self):
        """Test that the result is as expected when data is masked."""
        data = ma.array([[1, 2, 3],
                         [2, 4, 6],
                         [5, 10, 15]],
                        mask=[[0, 0, 0],
                              [1, 0, 0],
                              [0, 0, 0]])
        cube = set_up_cube(data, "wind_speed", "m s-1")
        expected = ma.array([[1, 2, 3],
                             [3, 6, 9]],
                            mask=[[1, 0, 0],
                                  [1, 0, 0]])
        result = self.plugin.calculate_difference(cube, "y")
        self.assertIsInstance(result, Cube)
        self.assertArrayEqual(result.data, expected)
        self.assertArrayEqual(result.data.mask, expected.mask)
class Test_gradient_from_diff(IrisTest):

    """Test for correct behaviour when calculating a gradient"""

    def setUp(self):
        """Set up cube."""
        data = np.array([[1, 2, 3],
                         [2, 4, 2],
                         [5, 10, 15]])
        x_coord = DimCoord(2.*np.arange(3), "projection_x_coordinate")
        y_coord = DimCoord(2.*np.arange(3), "projection_y_coordinate")
        self.cube = iris.cube.Cube(data, "wind_speed", units="m s-1",
                                   dim_coords_and_dims=[(y_coord, 0),
                                                        (x_coord, 1)])
        self.plugin = DifferenceBetweenAdjacentGridSquares(gradient=True)

    def test_basic(self):
        """Test contents and metadata"""
        expected = np.array([[0.5, 0.5, 0.5],
                             [2.0, 0.0, -2.0],
                             [2.5, 2.5, 2.5]])
        xdiff = self.plugin.calculate_difference(self.cube, "x")
        result = self.plugin.gradient_from_diff(xdiff, self.cube, "x")
        self.assertArrayAlmostEqual(result.data, expected)
        self.assertEqual(result.name(), "gradient_of_wind_speed")