class_docstr: These test cases exercise the interface to the proto plan
  generation but do not call Spark.
class_docstr_tok: ["These","test","cases","exercise","the","interface","to","the","proto","plan","generation","but","do","not","call","Spark","."]
code: def test_join_with_join_type(self):
      df_left = self.connect.with_plan(Read("table"))
      df_right = self.connect.with_plan(Read("table"))
      for join_type_str, join_type in [
          (None, proto.Join.JoinType.JOIN_TYPE_INNER),
          ("inner", proto.Join.JoinType.JOIN_TYPE_INNER),
          ("outer", proto.Join.JoinType.JOIN_TYPE_FULL_OUTER),
          ("full", proto.Join.JoinType.JOIN_TYPE_FULL_OUTER),
          ("fullouter", proto.Join.JoinType.JOIN_TYPE_FULL_OUTER),
          ("full_outer", proto.Join.JoinType.JOIN_TYPE_FULL_OUTER),
          ("left", proto.Join.JoinType.JOIN_TYPE_LEFT_OUTER),
          ("leftouter", proto.Join.JoinType.JOIN_TYPE_LEFT_OUTER),
          ("left_outer", proto.Join.JoinType.JOIN_TYPE_LEFT_OUTER),
          ("right", proto.Join.JoinType.JOIN_TYPE_RIGHT_OUTER),
          ("rightouter", proto.Join.JoinType.JOIN_TYPE_RIGHT_OUTER),
          ("right_outer", proto.Join.JoinType.JOIN_TYPE_RIGHT_OUTER),
          ("semi", proto.Join.JoinType.JOIN_TYPE_LEFT_SEMI),
          ("leftsemi", proto.Join.JoinType.JOIN_TYPE_LEFT_SEMI),
          ("left_semi", proto.Join.JoinType.JOIN_TYPE_LEFT_SEMI),
          ("anti", proto.Join.JoinType.JOIN_TYPE_LEFT_ANTI),
          ("leftanti", proto.Join.JoinType.JOIN_TYPE_LEFT_ANTI),
          ("left_anti", proto.Join.JoinType.JOIN_TYPE_LEFT_ANTI),
          ("cross", proto.Join.JoinType.JOIN_TYPE_CROSS),
      ]:
          joined_df = df_left.join(
              df_right, on=col("name"), how=join_type_str
          )._plan.to_proto(self.connect)
          self.assertEqual(joined_df.root.join.join_type, join_type)
  
imports: import unittest
  import uuid
  import datetime
  import decimal
  import math
  from pyspark.testing.connectutils import PlanOnlyTestFixture, should_test_connect, connect_requirement_message
  from pyspark.errors import PySparkValueError
label_desc: Use image node_id 42 for calling the SparkConnectPlanTests obj's underlying member method code with example usage: obj.test_join_with_join_type() without return types