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 precision keyword detecting cyclic point
docstr_tok: ["Test","precision","keyword","detecting","cyclic","point"]
code: def test_precision_has_cyclic(self):
      """Test precision keyword detecting cyclic point"""
      r_data = np.concatenate((self.data2d, self.data2d[:, :1]), axis=1)
      r_lons = np.concatenate((self.lons, np.array([360 + 1e-3])))
      c_data, c_lons = add_cyclic(r_data, x=r_lons, precision=1e-2)
      assert_array_equal(c_data, r_data)
      assert_array_equal(c_lons, r_lons)
  
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 23 for calling the TestAddCyclic obj's underlying member method code with example usage: obj.test_precision_has_cyclic() without return types