code: def test_add_features_same_booster_behaviour(tmp_path):
      X = np.random.random((100, 5))
      X[:, [1, 3]] = 0
      names = [f"col_{i}" for i in range(5)]
      for j in range(1, 5):
          d1 = lgb.Dataset(X[:, :j], feature_name=names[:j]).construct()
          d2 = lgb.Dataset(X[:, j:], feature_name=names[j:]).construct()
          d1.add_features_from(d2)
          d = lgb.Dataset(X, feature_name=names).construct()
          y = np.random.random(100)
          d1.set_label(y)
          d.set_label(y)
          b1 = lgb.Booster(train_set=d1)
          b = lgb.Booster(train_set=d)
          for _ in range(10):
              b.update()
              b1.update()
          dname = tmp_path / "d.txt"
          d1name = tmp_path / "d1.txt"
          b1.save_model(d1name)
          b.save_model(dname)
          with open(dname, "rt") as df:
              dtxt = df.read()
          with open(d1name, "rt") as d1f:
              d1txt = d1f.read()
          assert dtxt == d1txt
  
imports: import filecmp
  import numbers
  import re
  from copy import deepcopy
  from os import getenv
  from pathlib import Path
  import numpy
  import pytest
  from scipy import sparse
  from sklearn.datasets import dump_svmlight_file, load_svmlight_file
  from sklearn.model_selection import train_test_split
  import lightgbm
  from lightgbm.compat import PANDAS_INSTALLED, pd_DataFrame, pd_Series
  from .utils import dummy_obj, load_breast_cancer, mse_obj, np_assert_array_equal
label_desc: Use image node_id 12 for calling a global function with example usage: test_add_features_same_booster_behaviour(tmp_path) without return types