code: def test_full_outer(self):
      left_rows = ((1, 4, "a"), (2, 3, "b"), (3, 2, "c"))
  
      right_rows = ((1, 4, "a"), (2, 3, "b"), (4, 2, "c"))
  
      left = Table(left_rows, self.left_column_names, self.column_types)
      right = Table(
          right_rows, self.right_column_names, self.column_types
      )
  
      new_table = left.join(right, "one", "four", full_outer=True)
  
      self.assertIsNot(new_table, left)
      self.assertIsNot(new_table, right)
      self.assertColumnNames(
          new_table, ["one", "two", "three", "four", "five", "six"]
      )
      self.assertColumnTypes(
          new_table, [Number, Number, Text, Number, Number, Text]
      )
      self.assertRows(
          new_table,
          [
              (1, 4, "a", 1, 4, "a"),
              (2, 3, "b", 2, 3, "b"),
              (3, 2, "c", None, None, None),
              (None, None, None, 4, 2, "c"),
          ],
      )
  
imports: from agate import Table
  from agate.data_types import Number, Text
  from agate.testcase import AgateTestCase
label_desc: Use image node_id 19 for calling the TestJoin obj's underlying member method code with example usage: obj.test_full_outer() without return types