text: """Test ZHA Core channels."""
  import pytest
  import zigpy.types as t
  
  import homeassistant.components.zha.core.channels as channels
  import homeassistant.components.zha.core.device as zha_device
  import homeassistant.components.zha.core.registries as registries
  
  from .common import make_device
  
  
  @pytest.fixture
  def ieee():
      """IEEE fixture."""
      return t.EUI64.deserialize(b"ieeeaddr")[0]
  
  
  @pytest.fixture
  def nwk():
      """NWK fixture."""
      return t.NWK(0xBEEF)
  
  
  @pytest.mark.parametrize(
      "cluster_id, bind_count, attrs",
      [
          (0x0000, 1, {}),
          (0x0001, 1, {"battery_voltage", "battery_percentage_remaining"}),
          (0x0003, 1, {}),
          (0x0004, 1, {}),
          (0x0005, 1, {}),
          (0x0006, 1, {"on_off"}),
          (0x0007, 1, {}),
          (0x0008, 1, {"current_level"}),
          (0x0009, 1, {}),
          (0x000C, 1, {"present_value"}),
          (0x000D, 1, {"present_value"}),
          (0x000E, 1, {"present_value"}),
          (0x000D, 1, {"present_value"}),
          (0x0010, 1, {"present_value"}),
          (0x0011, 1, {"present_value"}),
          (0x0012, 1, {"present_value"}),
          (0x0013, 1, {"present_value"}),
          (0x0014, 1, {"present_value"}),
          (0x0015, 1, {}),
          (0x0016, 1, {}),
          (0x0019, 1, {}),
          (0x001A, 1, {}),
          (0x001B, 1, {}),
          (0x0020, 1, {}),
          (0x0021, 1, {}),
          (0x0101, 1, {"lock_state"}),
          (0x0202, 1, {"fan_mode"}),
          (0x0300, 1, {"current_x", "current_y", "color_temperature"}),
          (0x0400, 1, {"measured_value"}),
          (0x0401, 1, {"level_status"}),
          (0x0402, 1, {"measured_value"}),
          (0x0403, 1, {"measured_value"}),
          (0x0404, 1, {"measured_value"}),
          (0x0405, 1, {"measured_value"}),
          (0x0406, 1, {"occupancy"}),
          (0x0702, 1, {"instantaneous_demand"}),
          (0x0B04, 1, {"active_power"}),
          (0x1000, 1, {}),
      ],
  )
  async def test_in_channel_config(cluster_id, bind_count, attrs, zha_gateway, hass):
      """Test ZHA core channel configuration for input clusters."""
      zigpy_dev = make_device(
          [cluster_id],
          [],
          0x1234,
          "00:11:22:33:44:55:66:77",
          "test manufacturer",
          "test model",
      )
      zha_dev = zha_device.ZHADevice(hass, zigpy_dev, zha_gateway)
  
      cluster = zigpy_dev.endpoints[1].in_clusters[cluster_id]
      channel_class = registries.ZIGBEE_CHANNEL_REGISTRY.get(
          cluster_id, channels.AttributeListeningChannel
      )
      channel = channel_class(cluster, zha_dev)
  
      await channel.async_configure()
  
      assert cluster.bind.call_count == bind_count
      assert cluster.configure_reporting.call_count == len(attrs)
      reported_attrs = {attr[0][0] for attr in cluster.configure_reporting.call_args_list}
      assert set(attrs) == reported_attrs
  
  
  @pytest.mark.parametrize(
      "cluster_id, bind_count",
      [
          (0x0000, 1),
          (0x0001, 1),
          (0x0003, 1),
          (0x0004, 1),
          (0x0005, 1),
          (0x0006, 1),
          (0x0007, 1),
          (0x0008, 1),
          (0x0009, 1),
          (0x0015, 1),
          (0x0016, 1),
          (0x0019, 1),
          (0x001A, 1),
          (0x001B, 1),
          (0x0020, 1),
          (0x0021, 1),
          (0x0101, 1),
          (0x0202, 1),
          (0x0300, 1),
          (0x0400, 1),
          (0x0402, 1),
          (0x0403, 1),
          (0x0405, 1),
          (0x0406, 1),
          (0x0702, 1),
          (0x0B04, 1),
          (0x1000, 1),
      ],
  )
  async def test_out_channel_config(cluster_id, bind_count, zha_gateway, hass):
      """Test ZHA core channel configuration for output clusters."""
      zigpy_dev = make_device(
          [],
          [cluster_id],
          0x1234,
          "00:11:22:33:44:55:66:77",
          "test manufacturer",
          "test model",
      )
      zha_dev = zha_device.ZHADevice(hass, zigpy_dev, zha_gateway)
  
      cluster = zigpy_dev.endpoints[1].out_clusters[cluster_id]
      cluster.bind_only = True
      channel_class = registries.ZIGBEE_CHANNEL_REGISTRY.get(
          cluster_id, channels.AttributeListeningChannel
      )
      channel = channel_class(cluster, zha_dev)
  
      await channel.async_configure()
  
      assert cluster.bind.call_count == bind_count
      assert cluster.configure_reporting.call_count == 0
  
  
  def test_channel_registry():
      """Test ZIGBEE Channel Registry."""
      for (cluster_id, channel) in registries.ZIGBEE_CHANNEL_REGISTRY.items():
          assert isinstance(cluster_id, int)
          assert 0 <= cluster_id <= 0xFFFF
          assert issubclass(channel, channels.ZigbeeChannel)
  