diff --git a/lib/iris/cube.py b/lib/iris/cube.py index a1a07caab2..bf23233f4c 100644 --- a/lib/iris/cube.py +++ b/lib/iris/cube.py @@ -1095,7 +1095,7 @@ def add_cell_measure(self, cell_measure, data_dims=None): if self.cell_measures(cell_measure): raise ValueError("Duplicate cell_measures are not permitted.") data_dims = self._check_multi_dim_metadata(cell_measure, data_dims) - self._cell_measures_and_dims.append([cell_measure, data_dims]) + self._cell_measures_and_dims.append((cell_measure, data_dims)) self._cell_measures_and_dims.sort( key=lambda cm_dims: (cm_dims[0]._as_defn(), cm_dims[1]) ) @@ -1125,7 +1125,7 @@ def add_ancillary_variable(self, ancillary_variable, data_dims=None): ancillary_variable, data_dims ) self._ancillary_variables_and_dims.append( - [ancillary_variable, data_dims] + (ancillary_variable, data_dims) ) self._ancillary_variables_and_dims.sort( key=lambda av_dims: (av_dims[0]._as_defn(), av_dims[1]) @@ -3583,6 +3583,15 @@ def __eq__(self, other): or coord_comparison["non_equal_data_dimension"] ) + if result: + anc_diff = set(self._ancillary_variables_and_dims) == set( + other._ancillary_variables_and_dims + ) + cm_diff = set(self._cell_measures_and_dims) == set( + other._cell_measures_and_dims + ) + result = anc_diff and cm_diff + # Having checked everything else, check approximate data equality. if result: result = da.allclose( diff --git a/lib/iris/tests/unit/cube/test_Cube.py b/lib/iris/tests/unit/cube/test_Cube.py index cd2484370b..e1f94be783 100644 --- a/lib/iris/tests/unit/cube/test_Cube.py +++ b/lib/iris/tests/unit/cube/test_Cube.py @@ -25,7 +25,13 @@ from iris.analysis import MEAN from iris.aux_factory import HybridHeightFactory from iris.cube import Cube -from iris.coords import AuxCoord, DimCoord, CellMeasure, AncillaryVariable +from iris.coords import ( + AuxCoord, + DimCoord, + CellMeasure, + AncillaryVariable, + CellMethod, +) from iris.exceptions import ( CoordinateNotFoundError, CellMeasureNotFoundError, @@ -2206,5 +2212,54 @@ def test_data_bool_not_eq(self): self.assertFalse(cube1 == cube2) +class Test__eq__meta(tests.IrisTest): + def test_ancillary_fail(self): + cube1 = Cube([0, 1]) + cube2 = Cube([0, 1]) + avr = AncillaryVariable([2, 3], long_name="foo") + cube2.add_ancillary_variable(avr, 0) + self.assertFalse(cube1 == cube2) + + def test_ancillary_reorder(self): + cube1 = Cube([0, 1]) + cube2 = Cube([0, 1]) + avr1 = AncillaryVariable([2, 3], long_name="foo") + avr2 = AncillaryVariable([4, 5], long_name="bar") + # Add the same ancillary variables to cube1 and cube2 in + # opposite orders. + cube1.add_ancillary_variable(avr1, 0) + cube1.add_ancillary_variable(avr2, 0) + cube2.add_ancillary_variable(avr2, 0) + cube2.add_ancillary_variable(avr1, 0) + self.assertTrue(cube1 == cube2) + + def test_cell_measure_fail(self): + cube1 = Cube([0, 1]) + cube2 = Cube([0, 1]) + cms = CellMeasure([2, 3], measure="area", long_name="foo") + cube2.add_cell_measure(cms, 0) + self.assertFalse(cube1 == cube2) + + def test_cell_measure_reorder(self): + cube1 = Cube([0, 1]) + cube2 = Cube([0, 1]) + cms1 = CellMeasure([2, 3], measure="area", long_name="foo") + cms2 = CellMeasure([4, 5], measure="area", long_name="bar") + # Add the same cell measure to cube1 and cube2 in + # opposite orders. + cube1.add_cell_measure(cms1, 0) + cube1.add_cell_measure(cms2, 0) + cube2.add_cell_measure(cms2, 0) + cube2.add_cell_measure(cms1, 0) + self.assertTrue(cube1 == cube2) + + def test_cell_method_fail(self): + cube1 = Cube([0, 1]) + cube2 = Cube([0, 1]) + cmth = CellMethod("mean", "time", "6hr") + cube2.add_cell_method(cmth) + self.assertFalse(cube1 == cube2) + + if __name__ == "__main__": tests.main()