code: def test_Clone(self) -> None:
      # Test simple cloning.
      arm = Arm({"x": 0, "y": "a"})
      obsf = ObservationFeatures.from_arm(arm, trial_index=3)
      self.assertIsNot(obsf, obsf.clone())
      self.assertEqual(obsf, obsf.clone())
  
      # Test cloning with swapping parameters.
      clone_with_new_params = obsf.clone(
          replace_parameters={"x": 1, "y": "b"}
      )
      self.assertNotEqual(obsf, clone_with_new_params)
      obsf.parameters = {"x": 1, "y": "b"}
      self.assertEqual(obsf, clone_with_new_params)
  
imports: import json
  from unittest.mock import Mock, PropertyMock
  import numpy
  import pandas
  from ax.core.arm import Arm
  from ax.core.base_trial import TrialStatus
  from ax.core.batch_trial import BatchTrial
  from ax.core.data import Data
  from ax.core.generator_run import GeneratorRun
  from ax.core.map_data import MapData, MapKeyInfo
  from ax.core.observation import Observation, ObservationData, ObservationFeatures, observations_from_data, observations_from_map_data, recombine_observations, separate_observations
  from ax.core.trial import Trial
  from ax.utils.common.testutils import TestCase
label_desc: Use image node_id 2 for calling the ObservationsTest obj's underlying member method code with example usage: obj.test_Clone() without return types