code: def test_tuple_type(self):
      self.assertEqual(
          TupleTypeInfo([Types.STRING(), Types.INT()]),
          TupleTypeInfo([Types.STRING(), Types.INT()]),
          True,
      )
  
      self.assertEqual(
          TupleTypeInfo([Types.STRING(), Types.INT()]).__str__(),
          "TupleTypeInfo(String, Integer)",
      )
  
      self.assertNotEqual(
          TupleTypeInfo([Types.STRING(), Types.INT()]),
          TupleTypeInfo([Types.STRING(), Types.BOOLEAN()]),
      )
  
      self.assertEqual(
          Types.TUPLE([Types.STRING(), Types.INT()]),
          TupleTypeInfo([Types.STRING(), Types.INT()]),
      )
  
      self.assertEqual(
          Types.TUPLE([Types.STRING(), Types.INT()]).get_field_types(),
          [Types.STRING(), Types.INT()],
      )
  
imports: from pyflink.common.typeinfo import Types, RowTypeInfo, TupleTypeInfo, _from_java_type
  from pyflink.testing.test_case_utils import PyFlinkTestCase
label_desc: Use image node_id 2 for calling the TypeInfoTests obj's underlying member method code with example usage: obj.test_tuple_type() without return types