code: def test_with_shuffle_and_one_chunk(func_name, func_opts):
      # no axis is monotonic
      data1 = pd.DataFrame(
          np.random.rand(10, 10),
          index=[0, 10, 2, 3, 4, 5, 6, 7, 8, 9],
          columns=[4, 1, 3, 2, 10, 5, 9, 8, 6, 7],
      )
      data1 = to_boolean_if_needed(func_opts.func_name, data1)
      df1 = from_pandas(data1, chunk_size=(5, 10))
      data2 = pd.DataFrame(
          np.random.rand(10, 10),
          index=[11, 1, 2, 5, 7, 6, 8, 9, 10, 3],
          columns=[5, 9, 12, 3, 11, 10, 6, 4, 1, 2],
      )
      data2 = to_boolean_if_needed(func_opts.func_name, data2)
      df2 = from_pandas(data2, chunk_size=(6, 10))
  
      df3 = func_opts.func(df1, df2)
  
      # test df3's index and columns
      pd.testing.assert_index_equal(
          df3.columns_value.to_pandas(),
          func_opts.func(data1, data2).columns,
      )
      assert isinstance(df3.index_value.value, IndexValue.Int64Index)
      pd.testing.assert_index_equal(
          df3.index_value.to_pandas(), pd.Index([], dtype=np.int64)
      )
      assert df3.index_value.key != df1.index_value.key
      assert df3.index_value.key != df2.index_value.key
      assert df3.shape[1] == 12  # columns is recorded, so we can get it
  
      df1, df2, df3 = tile(df1, df2, df3)
  
      assert df3.chunk_shape == (2, 1)
      proxy_keys = set()
      for c in df3.chunks:
          assert isinstance(c.op, func_opts.op)
          assert len(c.inputs) == 2
          # test left side
          assert isinstance(c.inputs[0].op, DataFrameIndexAlign)
          assert c.inputs[0].op.stage == OperandStage.reduce
          expect_dtypes = pd.concat(
              [
                  ic.inputs[0].op.data.dtypes
                  for ic in c.inputs[0].inputs[0].inputs
                  if ic.index[0] == 0
              ]
          )
          pd.testing.assert_series_equal(
              c.inputs[0].dtypes, expect_dtypes
          )
          pd.testing.assert_index_equal(
              c.inputs[0].columns_value.to_pandas(),
              c.inputs[0].dtypes.index,
          )
          assert isinstance(
              c.inputs[0].index_value.to_pandas(), type(data1.index)
          )
          assert isinstance(
              c.inputs[0].inputs[0].op, DataFrameShuffleProxy
          )
          proxy_keys.add(c.inputs[0].inputs[0].op.key)
          for ic, ci in zip(c.inputs[0].inputs[0].inputs, df1.chunks):
              assert isinstance(ic.op, DataFrameIndexAlign)
              assert ic.op.stage == OperandStage.map
              assert ic.op.index_shuffle_size == 2
              assert isinstance(
                  ic.index_value.to_pandas(), type(data1.index)
              )
              assert ic.op.column_min == ci.columns_value.min_val
              assert (
                  ic.op.column_min_close
                  == ci.columns_value.min_val_close
              )
              assert ic.op.column_max == ci.columns_value.max_val
              assert (
                  ic.op.column_max_close
                  == ci.columns_value.max_val_close
              )
              assert ic.op.column_shuffle_size is None
              assert ic.columns_value is not None
              assert ic.inputs[0] is ci.data
          # test right side
          assert isinstance(c.inputs[1].op, DataFrameIndexAlign)
          assert c.inputs[1].op.stage == OperandStage.reduce
          expect_dtypes = pd.concat(
              [
                  ic.inputs[0].op.data.dtypes
                  for ic in c.inputs[1].inputs[0].inputs
                  if ic.index[0] == 0
              ]
          )
          pd.testing.assert_series_equal(
              c.inputs[1].dtypes, expect_dtypes
          )
          pd.testing.assert_index_equal(
              c.inputs[1].columns_value.to_pandas(),
              c.inputs[1].dtypes.index,
          )
          assert isinstance(
              c.inputs[0].index_value.to_pandas(), type(data1.index)
          )
          assert isinstance(
              c.inputs[1].inputs[0].op, DataFrameShuffleProxy
          )
          proxy_keys.add(c.inputs[1].inputs[0].op.key)
          for ic, ci in zip(c.inputs[1].inputs[0].inputs, df2.chunks):
              assert isinstance(ic.op, DataFrameIndexAlign)
              assert ic.op.stage == OperandStage.map
              assert ic.op.index_shuffle_size == 2
              assert isinstance(
                  ic.index_value.to_pandas(), type(data1.index)
              )
              assert ic.op.column_shuffle_size is None
              assert ic.op.column_min == ci.columns_value.min_val
              assert (
                  ic.op.column_min_close
                  == ci.columns_value.min_val_close
              )
              assert ic.op.column_max == ci.columns_value.max_val
              assert (
                  ic.op.column_max_close
                  == ci.columns_value.max_val_close
              )
              assert ic.op.column_shuffle_size is None
              assert ic.columns_value is not None
              assert ic.inputs[0] is ci.data
  
      assert len(proxy_keys) == 2
  
imports: import datetime
  import itertools
  import operator
  from dataclasses import dataclass
  from typing import Callable
  import numpy
  import pandas
  import pytest
  from ....None import tensor
  from ....core import OutputType, OperandType, tile
  from ....core.operand import OperandStage
  from ....utils import dataslots
  from ...align import DataFrameIndexAlign, DataFrameShuffleProxy
  from ...core import IndexValue
  from ...datasource.dataframe import from_pandas, DataFrameDataSource
  from ...datasource.from_tensor import dataframe_from_tensor
  from ...datasource.series import from_pandas, SeriesDataSource
  from ...utils import hash_dtypes
  from ...utils import split_monotonic_index_min_max, build_split_idx_to_origin_idx, filter_index_value
  from ..None import DataFrameAbs, DataFrameAdd, DataFrameSubtract, DataFrameMul, DataFrameFloorDiv, DataFrameTrueDiv, DataFrameMod, DataFramePower, DataFrameEqual, DataFrameNotEqual, DataFrameGreater, DataFrameLess, DataFrameGreaterEqual, DataFrameLessEqual, DataFrameNot, DataFrameAnd, DataFrameOr, DataFrameXor
label_desc: Use image node_id 15 for calling a global function with example usage: test_with_shuffle_and_one_chunk(func_name, func_opts) without return types