class_docstr: Test def add_cyclic(data, x=None, y=None, axis=-1,
                      cyclic=360, precision=1e-4):
  - variations of data, x, and y with and without axis keyword
  - different units of x - cyclic keyword
  - detection of cyclic points - precision keyword
  - error catching
docstr: Test detection of cyclic point with cyclic keyword
docstr_tok: ["Test","detection","of","cyclic","point","with","cyclic","keyword"]
code: def test_cyclic_has_cyclic(self):
      """Test detection of cyclic point with cyclic keyword"""
      new_lons = np.deg2rad(self.lon2d)
      new_lats = np.deg2rad(self.lat2d)
      r_data = np.concatenate((self.data2d, self.data2d[:, :1]), axis=1)
      r_lons = np.concatenate(
          (new_lons, np.full((new_lons.shape[0], 1), np.deg2rad(360))),
          axis=1,
      )
      r_lats = np.concatenate((new_lats, new_lats[:, -1:]), axis=1)
      c_data, c_lons, c_lats = add_cyclic(
          r_data, x=r_lons, y=r_lats, cyclic=np.deg2rad(360)
      )
      assert_array_equal(c_data, self.c_data2d)
      assert_array_equal(c_lons, r_lons)
      assert_array_equal(c_lats, r_lats)
  
imports: import numpy
  import numpy.ma
  from numpy.testing import assert_array_equal
  import pytest
  from cartopy.util import add_cyclic, add_cyclic_point, has_cyclic
label_desc: Use image node_id 22 for calling the TestAddCyclic obj's underlying member method code with example usage: obj.test_cyclic_has_cyclic() without return types