code: def testJoin(self):
      def check(lhs, rhs, expected, merge_fn=lambda x, y: x + y):
          with self.subTest(lhs=lhs, rhs=rhs, expected=expected):
              result = partition_utils.join(lhs, rhs, merge_fn=merge_fn)
              self.assertEqual(result, expected)
  
      check(
          lhs=[(partition(), "a"), (partition(), "b")],
          rhs=[(partition(), "1"), (partition(), "2")],
          expected=[
              (partition(), "a1"),
              (partition(), "a2"),
              (partition(), "b1"),
              (partition(), "b2"),
          ],
      )
  
      check(
          lhs=[(partition(), "a"), (partition(), "b")],
          rhs=[],
          expected=[],
      )
  
      check(
          lhs=[],
          rhs=[(partition(), "1"), (partition(), "2")],
          expected=[],
      )
  
      check(
          lhs=[(partition(x=1), "x1"), (partition(x=2), "x2")],
          rhs=[(partition(y=1), "y1"), (partition(y=2), "y2")],
          expected=[
              (partition(x=1, y=1), "x1y1"),
              (partition(x=1, y=2), "x1y2"),
              (partition(x=2, y=1), "x2y1"),
              (partition(x=2, y=2), "x2y2"),
          ],
      )
  
      check(
          lhs=[(partition(x=1), "a"), (partition(x=2), "b")],
          rhs=[(partition(x=1), "pple"), (partition(x=2), "anana")],
          expected=[
              (partition(x=1), "apple"),
              (partition(x=2), "banana"),
          ],
      )
  
      check(
          lhs=[
              (partition(x=1, z=1), "x1"),
              (partition(x=2, z=2), "x2"),
          ],
          rhs=[
              (partition(y=1, z=1), "y1"),
              (partition(y=2, z=2), "y2"),
          ],
          expected=[
              (partition(x=1, y=1, z=1), "x1y1"),
              (partition(x=2, y=2, z=2), "x2y2"),
          ],
      )
  
      check(
          lhs=[
              (partition(x=1, y=1), "x1y1"),
              (partition(x=1, y=2), "x1y2"),
              (partition(x=2, y=1), "x2y1"),
              (partition(x=2, y=2), "x2y2"),
          ],
          rhs=[
              (partition(x=1, z=1), "z1"),
              (partition(x=2, z=2), "z2"),
          ],
          expected=[
              (partition(x=1, y=1, z=1), "x1y1z1"),
              (partition(x=1, y=2, z=1), "x1y2z1"),
              (partition(x=2, y=1, z=2), "x2y1z2"),
              (partition(x=2, y=2, z=2), "x2y2z2"),
          ],
      )
  
      check(
          lhs=[
              (partition(x=1, y=1), "x1y1"),
              (partition(x=1, y=2), "x1y2"),
              (partition(x=2, y=1), "x2y1"),
              (partition(x=2, y=2), "x2y2"),
          ],
          rhs=[
              (partition(x=1, z=1), "z1"),
              (partition(x=1, z=2), "z2"),
              (partition(x=2, z=3), "z3"),
              (partition(x=2, z=4), "z4"),
          ],
          expected=[
              (partition(x=1, y=1, z=1), "x1y1z1"),
              (partition(x=1, y=1, z=2), "x1y1z2"),
              (partition(x=1, y=2, z=1), "x1y2z1"),
              (partition(x=1, y=2, z=2), "x1y2z2"),
              (partition(x=2, y=1, z=3), "x2y1z3"),
              (partition(x=2, y=1, z=4), "x2y1z4"),
              (partition(x=2, y=2, z=3), "x2y2z3"),
              (partition(x=2, y=2, z=4), "x2y2z4"),
          ],
      )
  
imports: import tensorflow
  from tfx.orchestration.portable.input_resolution import partition_utils
label_desc: Use image node_id 3 for calling the PartitionUtilsTest obj's underlying member method code with example usage: obj.testJoin() without return types