def METHOD_NAME(self):
    floating_dtypes = [np.float16, np.float32, np.float64]
    if int(np.__version__.split(".")[1]) >= 22:
        # Numpy<1.22.0 didn't support `is_integer()` on floating types
        # so float128 etc don't work out-of-the-box because `tolist()`
        # doesn't convert those to Python float.
        floating_dtypes.append(np.longdouble)
    for dtype in floating_dtypes:
        with self.subTest(f"{dtype}, all integer"):
            arr = np.ones(3, dtype=dtype)
            arr[0] = 2
            arr[1] = -0.0
            obj = serialize_ndarray(arr)
            # test the round trip
            new = deserialize_ndarray(obj)
            np.testing.assert_array_equal(arr, new)
            self.assertEqual(arr.dtype, new.dtype)  # original vartype is restored
            # test the ones that can be are mapped to int
            self.assertIsInstance(obj["data"][0], int)
            self.assertIsInstance(obj["data"][1], int)
            self.assertIsInstance(obj["data"][2], int)
        with self.subTest(f"{dtype}, all float"):
            arr = np.empty(3, dtype=dtype)
            arr[0] = 1.5
            arr[1] = float("inf")
            arr[2] = float("nan")
            obj = serialize_ndarray(arr)
            # test the round trip
            new = deserialize_ndarray(obj)
            np.testing.assert_array_equal(arr, new)
            self.assertEqual(arr.dtype, new.dtype)  # original vartype is restored
            # test the ones that can be are mapped to int
            self.assertIsInstance(obj["data"][0], numbers.Real)
            self.assertIsInstance(obj["data"][1], numbers.Real)
            self.assertIsInstance(obj["data"][2], numbers.Real)
        with self.subTest(f"{dtype}, mixed"):
            arr = np.ones(3, dtype=dtype)
            arr[0] = 1.5
            arr[1] = -0.0
            obj = serialize_ndarray(arr)
            # test the round trip
            new = deserialize_ndarray(obj)
            np.testing.assert_array_equal(arr, new)
            self.assertEqual(arr.dtype, new.dtype)  # original vartype is restored
            # test the ones that can be are mapped to int
            self.assertIsInstance(obj["data"][0], numbers.Real)
            self.assertIsInstance(obj["data"][1], int)
            self.assertIsInstance(obj["data"][2], int)
    with self.subTest("complex, mixed"):
        arr = np.ones(3, dtype=complex)
        arr[0] = 1.5
        arr[1] = -0.0
        obj = serialize_ndarray(arr)
        # test the round trip
        new = deserialize_ndarray(obj)
        np.testing.assert_array_equal(arr, new)
        self.assertEqual(arr.dtype, new.dtype)
        # in this case everything is kept as a complex number
        self.assertIsInstance(obj["data"][0], complex)
        self.assertIsInstance(obj["data"][1], complex)
        self.assertIsInstance(obj["data"][2], complex)
    for dtype in [np.int8, np.int16, np.int32, np.int64]:
        with self.subTest(dtype):
            arr = np.empty(3, dtype=dtype)
            arr[0] = 2
            arr[1] = 0
            arr[2] = -1
            obj = serialize_ndarray(arr)
            # test the round trip
            new = deserialize_ndarray(obj)
            np.testing.assert_array_equal(arr, new)
            self.assertEqual(arr.dtype, new.dtype)  # original vartype is restored
            # test the ones that can be are mapped to int
            self.assertIsInstance(obj["data"][0], int)
            self.assertIsInstance(obj["data"][1], int)
            self.assertIsInstance(obj["data"][2], int)