code: def test_join(self):
      def callback_a(indices, key_indices):
          self.assertIsNone(indices)
          self.assertEqual(key_indices, self.expected_key_indices_a)
  
      dataset_a = dummy_dataset.DummyDataset(
          mode=self.mode_a,
          return_array=self.return_array,
          callback=callback_a,
          convert=True,
      )
  
      def callback_b(indices, key_indices):
          self.assertIsNone(indices)
          self.assertEqual(key_indices, self.expected_key_indices_b)
  
      dataset_b = dummy_dataset.DummyDataset(
          keys=("d", "e"),
          mode=self.mode_b,
          return_array=self.return_array,
          callback=callback_b,
      )
  
      view = dataset_a.join(dataset_b)
      self.assertIsInstance(view, chainer.dataset.TabularDataset)
      self.assertEqual(len(view), len(dataset_a))
      self.assertEqual(view.keys, dataset_a.keys + dataset_b.keys)
      self.assertEqual(
          view.mode, dataset_a.mode or dataset_b.mode or tuple
      )
  
      output = view.get_examples(None, self.key_indices)
  
      data = np.vstack((dataset_a.data, dataset_b.data))
      if self.key_indices is not None:
          data = data[list(self.key_indices)]
  
      for out, d in six.moves.zip_longest(output, data):
          np.testing.assert_equal(out, d)
          if self.return_array:
              self.assertIsInstance(out, np.ndarray)
          else:
              self.assertIsInstance(out, list)
  
      self.assertEqual(view.convert(output), "converted")
  
file_path: chainer/tests/chainer_tests/dataset_tests/tabular_tests/test_join.py
imports: import unittest
  import numpy
  import six
  import chainer
  from chainer import testing
  from chainer_tests.dataset_tests.tabular_tests import dummy_dataset
label_desc: Use image node_id 2 for calling the TestJoin obj's underlying member method code with example usage: obj.test_join() without return types