code: def test_keep_property_value_groups(self):
      policy = garbage_collection_policy_pb2.GarbageCollectionPolicy(
          keep_property_value_groups=garbage_collection_policy_pb2.GarbageCollectionPolicy.KeepPropertyValueGroups(
              groupings=[
                  garbage_collection_policy_pb2.GarbageCollectionPolicy.KeepPropertyValueGroups.Grouping(
                      property_name="examples_type.name"
                  ),
                  garbage_collection_policy_pb2.GarbageCollectionPolicy.KeepPropertyValueGroups.Grouping(
                      property_name="span",
                      keep_num=2,
                      keep_order=garbage_collection_policy_pb2.GarbageCollectionPolicy.KeepPropertyValueGroups.Grouping.KeepOrder.KEEP_ORDER_LARGEST,
                  ),
                  garbage_collection_policy_pb2.GarbageCollectionPolicy.KeepPropertyValueGroups.Grouping(
                      property_name="version",
                      keep_num=1,
                      keep_order=garbage_collection_policy_pb2.GarbageCollectionPolicy.KeepPropertyValueGroups.Grouping.KeepOrder.KEEP_ORDER_LARGEST,
                  ),
              ]
          )
      )
      self._example_gen.outputs.outputs[
          "examples"
      ].garbage_collection_policy.CopyFrom(policy)
      example_gen_node_uid = task_lib.NodeUid.from_node(
          self._pipeline, self._example_gen
      )
      pipeline_ops.initiate_pipeline_start(
          self._metadata, self._pipeline
      )
  
      examples_a_0_0 = self._produce_examples(0, 0)
      examples_a_1_0 = self._produce_examples(1, 0)
      examples_a_2_0 = self._produce_examples(2, 0)
      self._produce_examples(2, 1)  # Should not be garbage collected
      self._produce_examples(3, 0)  # Should not be garbage collected
      self.assertArtifactIdsEqual(
          [examples_a_0_0, examples_a_1_0, examples_a_2_0],
          garbage_collection.get_artifacts_to_garbage_collect_for_node(
              self._metadata, example_gen_node_uid, self._example_gen
          ),
      )
  
imports: import os
  import time
  from typing import Iterable, Optional, Union
  from absl import logging
  from absl.testing import parameterized
  from absl.testing.absltest import mock
  import tensorflow
  from tfx.dsl.io import fileio
  from tfx.orchestration import metadata
  from tfx.orchestration.experimental.core import garbage_collection
  from tfx.orchestration.experimental.core import pipeline_ops
  from tfx.orchestration.experimental.core import task
  from tfx.orchestration.experimental.core import test_utils
  from tfx.orchestration.experimental.core.testing import test_async_pipeline
  from tfx.proto.orchestration import garbage_collection_policy_pb2
  from tfx.types.artifact import Artifact
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 16 for calling the GarbageCollectionTest obj's underlying member method code with example usage: obj.test_keep_property_value_groups() without return types