code: def test_build_concatenated_rows_frame(setup, columns):
      df = pd.DataFrame(np.random.rand(16, 8), columns=columns)
  
      # single chunk
      mdf = tile(DataFrame(df, chunk_size=8))
      concatenated = build_concatenated_rows_frame(mdf)
      assert len(concatenated.chunks) == 2
      pd.testing.assert_frame_equal(concatenated.execute().fetch(), df)
  
      # multiple chunks
      mdf = tile(DataFrame(df, chunk_size=5))
      concatenated = build_concatenated_rows_frame(mdf)
      assert len(concatenated.chunks) == 4
      for i in range(4):
          pd.testing.assert_index_equal(
              concatenated.chunks[i].columns_value.to_pandas(),
              df.columns,
          )
      pd.testing.assert_frame_equal(concatenated.execute().fetch(), df)
  
imports: import operator
  from collections import OrderedDict
  from numbers import Integral
  from typing import List, Dict
  import numpy
  import pandas
  import pytest
  from ...config import option_context
  from ...core import tile
  from ...utils import Timer
  from ..core import IndexValue
  from ..initializer import DataFrame, Series, Index
  from ..utils import decide_dataframe_chunk_sizes, decide_series_chunk_size, split_monotonic_index_min_max, build_split_idx_to_origin_idx, parse_index, filter_index_value, infer_dtypes, infer_index_value, validate_axis, fetch_corner_data, make_dtypes, build_concatenated_rows_frame, merge_index_value, auto_merge_chunks, whether_to_clean_up
label_desc: Use image node_id 15 for calling a global function with example usage: test_build_concatenated_rows_frame(setup, columns) without return types