code: def test_series_and_series_with_shuffle(func_name, func_opts):
      data1 = pd.DataFrame(
          np.random.rand(10, 10),
          index=[4, 9, 3, 2, 1, 5, 8, 6, 7, 10],
          columns=[4, 1, 3, 2, 10, 5, 9, 8, 6, 7],
      )
      data1 = to_boolean_if_needed(func_opts.func_name, data1)
      s1 = from_pandas_series(data1.iloc[4], chunk_size=5)
      s2 = from_pandas_series(data1[10], chunk_size=6)
  
      s3 = func_opts.func(s1, s2)
  
      # test s3's index
      assert s3.shape == (np.nan,)
      assert s3.index_value.key != s1.index_value.key
      assert s3.index_value.key != s2.index_value.key
      pd.testing.assert_index_equal(
          s3.index_value.to_pandas(), pd.Index([], dtype=np.int64)
      )
  
      s1, s2, s3 = tile(s1, s2, s3)
  
      assert s3.chunk_shape == (2,)
      for c in s3.chunks:
          assert isinstance(c.op, func_opts.op)
          assert len(c.inputs) == 2
          # test the left side
          assert isinstance(c.inputs[0].op, DataFrameIndexAlign)
          assert c.inputs[0].op.stage == OperandStage.reduce
          assert c.inputs[0].op.output_types[0] == OutputType.series
          assert isinstance(
              c.inputs[0].inputs[0].op, DataFrameShuffleProxy
          )
          for j, ci, ic in zip(
              itertools.count(0),
              c.inputs[0].inputs[0].inputs,
              s1.chunks,
          ):
              assert isinstance(ci.op, DataFrameIndexAlign)
              assert ci.op.stage == OperandStage.map
              assert ci.index == (j,)
              assert ci.op.index_shuffle_size
              assert ci.inputs[0] is ic.data
  
          # test the right side
          assert isinstance(c.inputs[1].op, DataFrameIndexAlign)
          assert c.inputs[1].op.stage == OperandStage.reduce
          assert c.inputs[1].op.output_types[0] == OutputType.series
          assert isinstance(
              c.inputs[1].inputs[0].op, DataFrameShuffleProxy
          )
          for j, ci, ic in zip(
              itertools.count(0),
              c.inputs[1].inputs[0].inputs,
              s2.chunks,
          ):
              assert isinstance(ci.op, DataFrameIndexAlign)
              assert ci.op.stage == OperandStage.map
              assert ci.index == (j,)
              assert ci.op.index_shuffle_size
              assert ci.inputs[0] is ic.data
  
      # make sure shuffle proxies' key are different
      proxy_keys = set()
      for c in s3.chunks:
          proxy_keys.add(c.inputs[0].inputs[0].op.key)
          proxy_keys.add(c.inputs[1].inputs[0].op.key)
      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 9 for calling a global function with example usage: test_series_and_series_with_shuffle(func_name, func_opts) without return types